我有一个包含4个dicts的列表:
$txt = 'C:\directory\sub-directory\service.exe /ThisTextNeedsRemoving'
$txt -replace '(?<=\.exe).+', ''
这些决定中的每一个都如下组成:
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'
的结果。我认为通过使用temp_dict.values()
,我将返回一个字典。
最终,我想要恢复一个干净的格式(我的一些印刷品包括诸如.values()
我希望它看起来像这样(例如):
Horse: [dict_keys(['HorseA'])] Lowest Odds: dict_values([{'jay': 0.8, 'john': 0.3, 'paul': 0.7, 'peter': 0.2}])
任何帮助将不胜感激。我是否从结构的角度使用带有嵌套在其中的dict的列表以正确的方式执行此操作?有更有效的方法吗?感谢。
答案 0 :(得分:1)
@albert说的是什么。另请注意,<dict>.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
。您应该以小写字母命名变量。这是prevailing convention。
我是否从结构的角度使用了一个正确的方法 列表中嵌入了dict?
如果不了解问题的大背景,就无法回答这个问题。但我想知道为什么你把dicts嵌入列表而不是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))
答案 1 :(得分:0)
<dict>.values()
正在返回一个所谓的dict_value
对象,该对象与数据类型list
相当。
所以你应该做类似
的事情low_odds = min(temp_dict)
此外,您应该重命名变量,因为这些变量根本不是dict
,而且在阅读代码时可能会让您感到困惑。