【问题标题】:Find Maximum Value in Nested Dictionary and return Key在嵌套字典中查找最大值并返回键
【发布时间】:2014-05-18 10:07:00
【问题描述】:

所以我有这段代码

dictionary = {
  'key1': {'a': 1, 'b': 2, 'c': 10}, 
  'key2': {'d': 1, 'e': 1, 'c': 11}, 
  'key3': {'d': 2, 'b': 1, 'g': 12}}

list1 = (a,b,c)

我想要做的是运行一个循环,找到列表中所有项目的最大值并返回键。例如,'c' 的最大值将返回 'key2','b' 的最大值将返回 'key1',等等。

目前为止

for value in list1:
     m = max(dictionary, key=lambda v: dictionary[v][value])
     print(m + "\n")

但这只有在字典的所有键中都存在相同的子键时才有效。有什么想法吗?

【问题讨论】:

    标签: python dictionary nested


    【解决方案1】:

    当密钥丢失时使用float('-inf')

    m = max(dictionary, key=lambda v: dictionary[v].get(value, float('-inf')))
    

    保证负无穷小于字典中的任何现有值,确保忽略缺少特定键的嵌套字典。

    演示:

    >>> dictionary = {
    ...   'key1': {'a': 1, 'b': 2, 'c': 10}, 
    ...   'key2': {'d': 1, 'e': 1, 'c': 11}, 
    ...   'key3': {'d': 2, 'b': 1, 'g': 12}}
    >>> list1 = ('a', 'b', 'c')
    >>> for value in list1:
    ...      print(value, max(dictionary, key=lambda v: dictionary[v].get(value, float('-inf'))))
    ... 
    a key1
    b key1
    c key2
    

    但是,如果您只循环遍历所有字典值一次,效率会更高:

    maximi = dict.fromkeys(list1, (None, float('-inf')))
    
    for key, nested in dictionary.items():
        for k in nested.keys() & maximi:  # intersection of keys
            if maximi[k][0] is None or dictionary[maximi[k][0]][k] < nested[k]:
                maximi[k] = (key, nested[k])
    
    for value in list1:
        print(value, maximi[value][0])
    

    假设您使用的是 Python 3;在 Python 2 中,将 .items() 替换为 .iteritems(),将 .keys() 替换为 .viewkeys()

    演示:

    >>> maximi = dict.fromkeys(list1, (None, float('-inf')))
    >>> for key, nested in dictionary.items():
    ...     for k in nested.keys() & maximi:  # intersection of keys
    ...         if maximi[k][0] is None or dictionary[maximi[k][0]][k] < nested[k]:
    ...             maximi[k] = (key, nested[k])
    ... 
    >>> maximi
    {'a': ('key1', 1), 'b': ('key1', 2), 'c': ('key2', 11)}
    >>> for value in list1:
    ...     print(value, maximi[value][0])
    ... 
    a key1
    b key1
    c key2
    

    【讨论】:

    • 我喜欢这个答案。您选择 -inf 而不是 None 有什么原因吗?
    • @icedtrees:因为在 Python 3 中,您无法将 None 与数字进行比较。
    • 工作就像一个魅力! (两种方法,我选择了第二种)非常感谢!
    猜你喜欢
    • 2022-12-18
    • 2021-12-16
    • 2018-11-30
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多