在平局的情况下,如何返回 python 中最大和最常见的数字?



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

定义一个返回元组的 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遇到平局时,它会返回它看到的第一个平局。但是因为我们现在返回tuples,并且因为我们知道每个tuple中的第二个值是唯一的(因为它来自字典(,我们可以确定不会有任何重复。当max遇到tuple时,它首先将tuple中的第一个值与它已经发现的最大值进行比较。如果那里有平局,它会比较下一个值。如果那里有平局,下一个值,等等。因此,当max(3, 10)(3, 12)进行比较时,它会看到(3, 12)是最大值。由于这是12进入key函数所产生的值,因此max12视为最大值。

您可以获取最大计数(使用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

最新更新