如何在列表中找到最常出现的元素?

4
def print_most_numbers_occurrences(numbers_str):
    number_list = numbers_str.split() 
    for i in number_list:
        i=max(number_list,key=number_list.count)
    print(i)


def test_print_most_numbers_occurrences():
     print_most_numbers_occurrences('2 3 40 1 5 4 3 3 9  9')
     print_most_numbers_occurrences('9 30 3 9 3 1 4')
     print_most_numbers_occurrences('19 30 13 4 9 3 1 4')

def main():
    test_print_most_numbers_occurrences()


main()

输出:

3
9
4

我想要获取'9 30 3 9 3 1 4'中所有最常重复的数字:9和3出现了两次,所以应该报告两次出现的情况而不仅仅是9
输出结果如下:
3
9
3
4

请纠正您的缩进和格式。 - Arya McCarthy
“Double max number” 是什么意思? - Arya McCarthy
2
"double max number" 是什么?另外,你的问题有些难以理解。有什么问题吗? - MSeifert
1
9和3各出现了两次,因此应该报告所有出现次数。 - Kee
2
查看collections.Counter,它会让事情变得更好。 - Alex Hall
1
@poke 错误的副本。此问题明确要求最重复元素 - 复数(不使用平局,应报告具有最大计数的所有元素)。 - MSeifert
2个回答

4

首先,在使用max时,您不需要for循环,因为max已经为您执行了该操作。

其次,如果您想要多个值,则max并不是一个好选择。对于这种计数操作,您应该使用collections.Counter(它还避免了多次计算出现次数的情况)。

from collections import Counter

def print_most_numbers_occurrences(numbers_str):
    number_list = numbers_str.split() 
    # count the occurrences
    cnts = Counter(number_list)
    # Get the maximum count
    maximum_cnt = max(cnts.values())
    # print all values that have the "maximum" count
    print(*[val for val, cnt in cnts.items() if cnt == maximum_cnt])

使用您提供的输入进行测试,输出结果如下:

3
9 3
4

如果你更喜欢简单的循环而不是列表推导式(或者你使用没有print函数的Python 2.x),你也可以使用以下代码:

def print_most_numbers_occurrences(numbers_str):
    number_list = numbers_str.split() 
    cnts = Counter(number_list)
    maximum_cnt = max(cnts.values())
    for value, cnt in cnts.items():
        if cnt == maximum_cnt:
            print(value)

这将会给出:

3
9
3
4

2
我本以为 [(_, maximum_cnt)] = cnts.most_common(1)maximum_cnt = max(cnts.values()) 更快,但出乎意料的是并非如此。 - AChampion
most_common 基于值执行完整排序或(部分)堆排序。因此,max 更快并不让我感到惊讶。 - MSeifert

0
from collections import Counter

a = ('2 3 40 1 5 4 3 3 9  9','9 30 3 9 3 1 4','19 30 13 4 9 3 1 4')

for x in a:
    x = x.split()
    b = Counter(x)
    z = max(b.values())
    for k in b.keys():
        if b[k] == z:
            print(k)

输出:

3
9
3
4

如果你想要另一种输出

from collections import Counter

a = ('2 3 40 1 5 4 3 3 9  9','9 30 3 9 3 1 4','19 30 13 4 9 3 1 4')

k = []
for x in a:
    x = x.split()
    b = Counter(x)
    z = max(b.values())
    k.append([f for f in b.keys() if b[f] == z])

print(k)

输出

[['3'], ['9', '3'], ['4']]

使用函数

from collections import Counter

def maxmy(sequences):
    k = []
    for x in sequences:
        x = x.split()
        b = Counter(x)
        z = max(b.values())
        k.append([f for f in b.keys() if b[f] == z])
    return k

maxmy(('2 3 40 1 5 4 3 3 9  9','9 30 3 9 3 1 4','19 30 13 4 9 3 1 4'))

输出

[['3'], ['9', '3'], ['4']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接