Python 访问多个嵌套字典以返回最小键和值

Python 访问多个嵌套字典以返回最小键和值,python,list,python-3.x,dictionary,data-structures,Python,List,Python 3.x,Dictionary,Data Structures,我有一份包含4条格言的清单: Epsom = [HorseA, HorseB, HorseC, HorseD] 这些格言中的每一条都由以下内容组成: for x in Epsom: print(x) {'HorseA': {'jay': 0.8, 'john': 0.3, 'paul': 0.7, 'peter': 0.2}} {'HorseB': {'jay': 0.4, 'john': 0.2, 'paul': 0.1, 'peter': 0.9}} {'HorseC': {'j

我有一份包含4条格言的清单:

Epsom = [HorseA, HorseB, HorseC, HorseD]
这些格言中的每一条都由以下内容组成:

for x in Epsom:
    print(x)

{'HorseA': {'jay': 0.8, 'john': 0.3, 'paul': 0.7, 'peter': 0.2}}
{'HorseB': {'jay': 0.4, 'john': 0.2, 'paul': 0.1, 'peter': 0.9}}
{'HorseC': {'jay': 0.8, 'john': 0.1, 'paul': 0.9, 'peter': 0.7}}
{'HorseD': {'jay': 0.6, 'john': 0.3, 'paul': 0.4, 'peter': 0.1}}
我想迭代Epsom,返回每匹马的名字和提供给它的最低值——这包括为马提供相同最低数量的人。就我所知:

for x in Epsom:
    horse_temp = x.keys()
    temp_dict = x.values()
    low_odds = min(temp_dict.values())
    print('Horse: {} -- Lowest Odds: {}'.format(horse_temp, low_odds))
我得到的错误是:

Traceback (most recent call last):
File "<pyshell#144>", line 4, in <module>
low_odds = min(temp_dict.values())
AttributeError: 'dict_values' object has no attribute 'values'
任何帮助都将不胜感激。从结构的角度来看,使用嵌套了dict的列表是否正确?有没有更有效的方法?谢谢。

.values()
正在返回一个所谓的
dict\u value
对象,该对象与数据类型
列表
相当

所以你应该做一些类似的事情

low_odds = min(temp_dict)

此外,您应该重命名变量,因为这些变量根本不是dict,在阅读代码时可能会混淆。

什么@albert说的。还要注意,
.keys()
还返回类似列表的对象。因此,如果希望马名是字符串,则不能仅使用
.keys()
的结果(请参见下面的代码)

以下是完整的解决方案:

for horse in epsom:
    horse_name, = horse.keys()  # same as: horse_name = horse.keys()[0]
    offers, = horse.values()    # same as: offers = horse.values()[0]
    min_odds = min(offers.values())
    lowest = ((k, v) for k, v in offers.items() if v == min_odds)
    formatted_lowest = ', '.join('{} {}'.format(k, v) for k, v in lowest)
    print('Horse: {} -- Lowest Odds: {}'.format(horse_name, formatted_lowest))
注意
epsom
而不是您的
epsom
。您应该用小写字母命名变量。这就是问题所在

从结构的角度来看,我是否使用了 列表中嵌套了dict

如果不了解问题的大背景,这是不可能回答的。但是我想知道为什么你把这些单词放在一个列表里而不是一个单词里

epsom = {
    'HorseA': {'jay': 0.8, 'john': 0.3, 'paul': 0.7, 'peter': 0.2},
    'HorseB': {'jay': 0.4, 'john': 0.2, 'paul': 0.1, 'peter': 0.9},
    'HorseC': {'jay': 0.8, 'john': 0.1, 'paul': 0.9, 'peter': 0.7},
    'HorseD': {'jay': 0.6, 'john': 0.3, 'paul': 0.4, 'peter': 0.1}
}
这样嵌套就少了,循环就更简单了:

for horse_name, offers in sorted(epsom.items()):
    min_odds = min(offers.values())
    lowest = ((k, v) for k, v in offers.items() if v == min_odds)
    formatted_lowest = ', '.join('{} {}'.format(k, v) for k, v in lowest)
    print('Horse: {} -- Lowest Odds: {}'.format(horse_name, formatted_lowest))

吉尔,非常感谢你。太棒了!我不知道为什么我要用一个列表——正如你所指出的,dict更有意义。
for horse_name, offers in sorted(epsom.items()):
    min_odds = min(offers.values())
    lowest = ((k, v) for k, v in offers.items() if v == min_odds)
    formatted_lowest = ', '.join('{} {}'.format(k, v) for k, v in lowest)
    print('Horse: {} -- Lowest Odds: {}'.format(horse_name, formatted_lowest))