在嵌套字典中查找最大值并返回密钥

not*_*k11 1 python dictionary nested

所以我有这段代码

dictionary = {
  'key1': {'a': 1, 'b': 2, 'c': 10}, 
  'key2': {'d': 1, 'e': 1, 'c': 11}, 
  'key3': {'d': 2, 'b': 1, 'g': 12}}
Run Code Online (Sandbox Code Playgroud)

list1 = (a,b,c)
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我有

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

但是只有在字典中的所有键中都存在相同的子键时,这才有效.关于该怎么做的任何想法?

Mar*_*ers 6

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

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

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

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)

但是,如果您只对一次字典值进行循环,则效率会更高:

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])
Run Code Online (Sandbox Code Playgroud)

这假设你使用的是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
Run Code Online (Sandbox Code Playgroud)

  • @icedtrees:因为在Python 3中,你无法将"无"与数字进行比较. (4认同)