我有一个数字清单。我创建了这个频率字典d:
from collections import Counter
mylist = [10, 8, 12, 7, 8, 8, 6, 4, 10, 12, 10, 12]
d = Counter(mylist)
print(d)
输出如下:
Counter({10: 3, 8: 3, 12: 3, 7: 1, 6: 1, 4: 1})
我知道,如果没有频率限制,我可以使用 max(d,key = d.get)获得价值。如果多个项目最大,该函数通常返回遇到的第一个项目。如何返回最大的数字(在这种情况下为12,而不是10)?谢谢您的帮助!
答案 0 :(得分:1)
定义一个返回元组的lambda函数。元组按其第一个值排序,然后按后续值平分。像这样:
max(d, key=lambda x:(d.get(x), x))
因此对于两个示例值,lambda将返回(3, 10)
和(3, 12)
。当然,第二个将被视为max
。
进一步的解释:
当给max
函数一个集合以查找最大和一个key
时,它将遍历集合中的值,并将每个值传递给key
函数。集合中的任何元素都会导致key
函数的最大输出被视为最大值。
在这种情况下,我们为其提供了lambda函数。 Lambda只是函数。从字面上看,它们的用法没有区别,只是定义它们的语法不同。上面的示例可以写为:
def maxKey(x):return (d.get(x), x)
max(d, key=maxKey)
它的行为方式相同。
使用该函数,我们可以看到它为您的样本数据提供的返回值。
maxKey(10) #(3, 10)
maxKey(12) #(3, 12)
上面的匿名lambda与使用d.get
之间的主要区别在于lambda返回了一个tuple
,其中包含两个值。
max
遇到平局时,它返回它看到的第一个。但是因为我们现在返回tuple
,并且因为我们知道每个tuple
中的第二个值都是唯一的(因为它来自字典),所以我们可以确定不会有任何重复项。当max
遇到tuple
时,它首先将tuple
中的第一个值与已经发现的最大值进行比较。如果那里有平局,它将比较下一个值。如果那里有平局,下一个值,等等。因此,当max
与(3, 10)
比较(3, 12)
时,将看到(3, 12)
是最大值。由于这是12
进入key
函数所产生的值,因此max
将把12
视为最大值。
答案 1 :(得分:0)
您可以获取最大计数(使用d.most_common
),然后获取所有具有最大计数的键的max
:
max_cnt = d.most_common(1)[0][1]
grt_max = max(n for n, cnt in d.items() if cnt == max_cnt)
print(grt_max)
输出:
12