关于python:如何在字典中查找多个最大值

How to find multiple maximums in a dictionary

试图分析一些字符串并计算它们出现的次数。这些数据存储在字典中。如果要使用max函数,则只会打印遇到的第一个最高数字。

1
2
3
count = {"cow": 4,"moo": 4,"sheep": 1}
print(max(count.keys(), key=lambda x: count[x]))
cow

这将使"奶牛"成为最大值。我如何将"奶牛"和"驼鹿"都打印出来?

1
2
count = {"cow": 4,"moo": 4,"sheep": 1}
cow, moo


为什么不简单一点?

1
2
3
mx = max(count.values())
print([k for k, v in count.items() if v == mx])
# ['cow', 'moo']

第二行中带括号的表达式是一个列表理解,本质上是一个for循环的简写,它运行在一个类似列表的对象(一个"iterable")上,并创建一个新的列表。在这种情况下,有两个循环变量(kv同时运行,它们的值由元组解包分配(.items()一个接一个返回对(key,value))。概括一下这里的列表理解大致相当于:

1
2
3
4
result = []
for k, v in count.items():
    if v == mx:
        result.append(k)

但是列表理解会运行得更快,而且一旦习惯了它,也更容易阅读。


只需将计数与defaultdict分组,并取最大值:

1
2
3
4
5
6
7
8
9
10
11
12
13
from collections import defaultdict

count = {"cow": 4,"moo": 4,"sheep": 1}

d = defaultdict(list)
for animal, cnt in count.items():
    d[cnt].append(animal)

print(dict(d))
# {4: ['cow', 'moo'], 1: ['sheep']}

print(max(d.items())[1])
# ['cow', 'moo']