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