这是一个简单的功能,但它让我很难过。我正在尝试计算列表中的模式,如果有> 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。
有什么想法吗?
答案 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)