Python计算列表中的多个模式

时间:2016-10-12 02:33:30

标签: python list

这是一个简单的功能,但它让我很难过。我正在尝试计算列表中的模式,如果有> 1种模式(频率相同),则需要显示。

def compute_mode(numbers):
mode = 0
count = 0
maxcount = 0
for number in numbers:
    count = numbers.count(number)
    if count >= maxcount:
        maxcount = count
        mode = number
        print("Mode: ", mode, "Count: ", maxcount)

函数调用:

print(compute_mode([0,1,3,5,7,3,0]))

输出:

Mode:  0 Count:  2
Mode:  3 Count:  2
Mode:  3 Count:  2
Mode:  0 Count:  2

我似乎无法使该功能不重复最后两行。我不确定为什么它会再次重复0和3。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

重复这些行,只是因为你的列表中有2个这样的数字。

您的功能无法跟踪其已经看过的号码,以便为其更新计数器。

要对事物进行计数,请使用Counter模块中适当命名的collections

>>> from collections import Counter
>>> Counter([0,1,3,5,7,3,0]).most_common()
[(0, 2), (3, 2), (1, 1), (5, 1), (7, 1)]

或者,另一种方法是跟踪您已经看过的数字,并使用{{1来更新字典中的计数器(类似于Counter的工作方式) }}:

defaultdict

答案 1 :(得分:2)

两次获得模式的原因是你的for循环遍历列表中的每个元素。因此,当它遇到先前看到的元素的第二个实例时,它会再次打印出来。

在其他新闻中,您的功能会因其他原因而失败 - 尝试删除第一个0,看看会发生什么。

这就是我要解决的问题:

from collections import Counter

def compute_mode(numbers):
    counts = Counter(numbers)
    maxcount = max(counts.values())
    for num,count in counts:
        if count == maxcount:
            print(num, count)

如果你想自己做所有繁重的工作:

def compute_mode(numbers):
    counts = {}
    maxcount = 0
    for number in numbers:
        if number not in counts:
            counts[number] = 0
        counts[number] += 1
        if counts[number] > maxcount:
            maxcount = counts[number]

    for number, count in counts.items():
        if count == maxcount:
            print(number, count)