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

1 投票
1 回答
3172 浏览
提问于 2025-04-18 01:33

我有一段代码

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")

但这只在字典中的所有键都有相同的子键时才有效。有没有什么好的主意?

1 个回答

8

当某个键缺失时,可以使用 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

撰写回答