如果是平局,如何在python中返回最大和最频繁的数字?

时间:2019-09-24 17:20:50

标签: python-3.x

我有一个数字清单。我创建了这个频率字典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)?谢谢您的帮助!

2 个答案:

答案 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