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

时间:2016-02-09 16:20:06

标签: python list python-3.x dictionary data-structures

我有一个包含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的列表以正确的方式执行此操作?有更有效的方法吗?感谢。

2 个答案:

答案 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,而且在阅读代码时可能会让您感到困惑。