不同的函数从Python字典返回相同的项

时间:2016-09-24 12:07:56

标签: python dictionary

ConcurrentHashMap

它的输出是:

import json, os

def load_data(filepath):
    if not os.path.exists(filepath):
        return None
    with open(filepath, 'r') as file:
        return json.load(file)

def get_biggest_bar(data):
    bars = []
    for bar in data:
        bars.append((bar['Cells']['SeatsCount'] , bar['Number']))
    max_number = max(bars)[1]
    (item for item in data if item['Number'] == max_number).__next__()    
    return item, max_number

def get_smallest_bar(data):
    bars = []
    for bar in data:
        bars.append((bar['Cells']['SeatsCount'] , bar['Number']))
    min_number = min(bars)[1]
    (item for item in data if item['Number'] == min_number).__next__()    
    return item, min_number

def get_closest_bar(data, longitude, latitude):
    coordinates = []
    def get_distance(point, input_point):
        return ((longitude-input_point[0])**2 + (latitude - input_point[1])**2)**1/2
    for cell in data:
        coordinates.append([cell['Cells']['geoData']['coordinates'],cell['Number']])
    for coor in coordinates:
        coor[0] = get_distance(point, coor[0])
    closest_bar = min(coordinates)[1]
    (item for item in data if item['Number'] == closest_bar).__next__()
    return item, closest_bar

if __name__ == '__main__':
    data = load_data("Bars.json")
    print(get_smallest_bar(data))
    print(get_biggest_bar(data))
    print(get_closest_bar(data, 50.0, 50.0))

如你所见,项目完全相同,但它们是不同的(我试图分离功能并单独运行它们,并输出不同的项目)!此外,你可以在fucntion的回报中看到第二个数字 - 它们是不同的!这件事是什么?!

3 个答案:

答案 0 :(得分:1)

您正在使用生成器获取项目,但在下一行中,该变量不是您认为的那样。来自发电机内部的项目超出范围。我宁愿返回实际生成的值。此外,您正在获得最接近某个点的条形图,但不是您传入函数的条形图。

因此,我认为item和point都是你在函数中错误使用的全局变量。

我有python2.7,所以从生成器获取下一个值的语法可能略有不同。

def load_data(filepath):
    data = [
        {'Number': 10, 'Cells': {'SeatsCount': 10, 'geoData': {'coordinates': (10, 10)}}},
        {'Number': 50, 'Cells': {'SeatsCount': 50, 'geoData': {'coordinates': (50, 50)}}},
        {'Number': 90, 'Cells': {'SeatsCount': 90, 'geoData': {'coordinates': (90, 90)}}}
    ]
    return data

def get_biggest_bar(data):
    bars = []
    for bar in data:
        bars.append((bar['Cells']['SeatsCount'] , bar['Number']))
    max_number = max(bars)[1]
    g = (item for item in data if item['Number'] == max_number)
    return next(g), max_number

def get_smallest_bar(data):
    bars = []
    for bar in data:
        bars.append((bar['Cells']['SeatsCount'] , bar['Number']))
    min_number = min(bars)[1]
    g = (item for item in data if item['Number'] == min_number)
    return next(g), min_number

def get_closest_bar(data, longitude, latitude):
    point = (longitude, latitude)
    coordinates = []
    def get_distance(point, input_point):
        return ((longitude-input_point[0])**2 + (latitude - input_point[1])**2)**1/2
    for cell in data:
        coordinates.append([cell['Cells']['geoData']['coordinates'],cell['Number']])
    for coor in coordinates:
        coor[0] = get_distance(point, coor[0])
    closest_bar = min(coordinates)[1]
    g = (item for item in data if item['Number'] == closest_bar)
    return next(g), closest_bar

if __name__ == '__main__':
    data = load_data("Bars.json")
    print("smallest", get_smallest_bar(data))
    print("biggest", get_biggest_bar(data))
    print("closest", get_closest_bar(data, 50.0, 50.0))

输出:

('smallest', ({'Cells': {'geoData': {'coordinates': (10, 10)}, 'SeatsCount': 10}, 'Number': 10}, 10))
('biggest', ({'Cells': {'geoData': {'coordinates': (90, 90)}, 'SeatsCount': 90}, 'Number': 90}, 90))
('closest', ({'Cells': {'geoData': {'coordinates': (50, 50)}, 'SeatsCount': 50}, 'Number': 50}, 50))

答案 1 :(得分:1)

在返回之前将调用结果分配给__next__(),如下所示:

result = (item for item in data if item['Number'] == closest_bar).__next__()
return result, closest_bar

答案 2 :(得分:1)

回答出了什么问题。我认为搜索min和max的代码不是" pythonic"。我想提出另一种方法:

(使用Kenny Ostrom的答案中的样本数据)

data = [ {'Number': 10, 'Cells': {'SeatsCount': 10, 'geoData': {'coordinates': (10, 10)}}},
         {'Number': 50, 'Cells': {'SeatsCount': 50, 'geoData': {'coordinates': (50, 50)}}},
         {'Number': 90, 'Cells': {'SeatsCount': 90, 'geoData': {'coordinates': (90, 90)}}} ]

biggest = max(data, key=lambda bar: bar['Cells']['SeatsCount'])
smallest = min(data, key=lambda bar: bar['Cells']['SeatsCount'])

对于最近的栏,需要一个基于原始代码get_distance的简单自定义键功能,但你明白了。