【问题标题】:Access to multiple nested dictionaries to return a minimum key and value访问多个嵌套字典以返回最小键和值
【发布时间】:2016-05-19 17:26:57
【问题描述】:

我有一个包含 4 个字典的列表:

Epsom = [HorseA, HorseB, HorseC, HorseD]

每一个 dicts 的组成如下:

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}]) 之类的内容)

我希望它看起来像这样(例如):

Horse: HorseA -- Lowest Odds: John 0.3, Paul 0.3
Horse: HorseB -- Lowest Odds: Peter 0.2
Horse: HorseC -- Lowest Odds: Jay 0.8, Paul 0.8
Horse: HorseD -- Lowest Odds: John 0.3

任何帮助将不胜感激。从结构的角度来看,我是否使用嵌套在其中的 dict 列表以正确的方式执行此操作?有没有更有效的方法来做到这一点?谢谢。

【问题讨论】:

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


    【解决方案1】:

    @albert 说了什么。另请注意,&lt;dict&gt;.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的列表?

    如果不了解问题的更大背景,这是不可能回答的。但我想知道为什么您将字典嵌套在列表中而不是字典中。如果你有

    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 更有意义。
    【解决方案2】:

    &lt;dict&gt;.values() 正在返回一个所谓的 dict_value 对象,它与数据类型 list 相当。

    所以你应该做类似的事情

    low_odds = min(temp_dict)
    

    此外,您应该重命名变量,因为它们根本不是dicts,而且在阅读您的代码时可能会造成混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2016-04-14
      • 2014-05-18
      • 2018-11-30
      • 2022-12-18
      相关资源
      最近更新 更多