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

不同的函数从Python字典返回相同的项,python,dictionary,Python,Dictionary,它的输出是: 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

它的输出是:

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))

正如您所看到的,项完全相同,但它们不同(我尝试了划分函数并分别运行它们,它们输出不同的项)!此外,你可以在函数的返回中看到第二个数字-它们是不同的!怎么了

您正在使用生成器获取项,但在下一行中,该变量不是您所认为的。发电机内部的项目超出范围。我更愿意返回实际生成的值。此外,您得到的是距离某个点最近的条,但不是传递到函数中的条

因此,我认为item和point都是全局变量,您在函数中错误地使用了它们

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

(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 37)
(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 434)
(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 170)
输出:

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))

您正在使用生成器获取项,但在下一行中,该变量不是您所认为的。发电机内部的项目超出范围。我更愿意返回实际生成的值。此外,您得到的是距离某个点最近的条,但不是传递到函数中的条

因此,我认为item和point都是全局变量,您在函数中错误地使用了它们

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

(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 37)
(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 434)
(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 170)
输出:

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))

在返回调用结果之前,将其分配给
\uuuuu next\uuuu()
,如下所示:

('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))

在返回调用结果之前,将其分配给
\uuuuu next\uuuu()
,如下所示:

('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))

问题的答案已经给出。我认为搜索min和max的代码不是“pythonic”。我想建议另一种方法:

(使用肯尼·奥斯特罗姆答案中的样本数据)


对于最近的条形图,需要一个基于原始代码的
get_distance
的简单自定义键功能,但您已经想到了。

回答了问题所在。我认为搜索min和max的代码不是“pythonic”。我想建议另一种方法:

(使用肯尼·奥斯特罗姆答案中的样本数据)


对于最近的条形图,需要一个基于原始代码的
get_distance
的简单自定义键函数,但您已经想到了。

这只是表明函数已损坏。你是否彻底测试过它们以确保正确性?正如我在帖子中所说的,我尝试单独运行,它们运行良好!另外,在每个函数的返回中,我返回了许多项,它们是不同的。我给你们写了一些测试数据,因为我并没有“文件名”。当你认为它们工作正常时,它们就不工作了。它们只是返回一些全局变量,在运行它们时恰好是正确的。这只是表明函数被破坏了。你是否彻底测试过它们以确保正确性?正如我在帖子中所说的,我尝试单独运行,它们运行良好!另外,在每个函数的返回中,我返回了许多项,它们是不同的。我给你们写了一些测试数据,因为我并没有“文件名”。当你认为它们工作正常时,它们就不工作了。它们只是返回一些全局变量,在您运行它们时恰好是正确的。我认为您应该使用座位计数。@KennyOstrom:谢谢您发现了这个错误。我已经更新了密码。我想你应该使用座位计数。@KennyOstrom:谢谢你发现了这个错误。我已经更新了代码。我理解关于范围的想法,但是关于
项目
的话让我困惑。generator后面的行在哪里,取它的
item
value?让我换一种说法。仅使用这些功能进行测试。没有项目。没有意义。如果你单独测试函数(就像它们一样),那么测试会很快告诉你哪里出了问题。我理解关于作用域的想法,但是关于
item
point
的话让我感到困惑。generator后面的行在哪里,取它的
item
value?让我换一种说法。仅使用这些功能进行测试。没有项目。没有意义。如果您单独测试这些函数(就像它们一样),那么测试将很快向您显示错误所在。