def mode(L):
shows = []
modeList = []
L.sort()
length = len(L)
for num in L:
count = L.count(num)
shows.append(count)
print 'List = ', L
maxI = shows.index(max(shows))
for i in shows:
if i == maxI:
if modeList == []:
mode = L[i]
modeList.append(mode)
print 'Mode = ', mode
elif mode not in modeList:
mode = L[i]
modeList.append(mode)
print 'Mode = ', mode
return mode
mode(L)
我似乎无法正确地遍历我的列表......
我可以使用第二个for循环成功获得第一个模式返回Mode = 87
但是,我无法让它搜索列表的其余部分,以便它也将返回Mode = 92
我删除了Mode = 92
的尝试,有人可以填写空白吗?
答案 0 :(得分:2)
您的代码的第一个问题是您的循环中有一个return
语句。到达时,函数结束,其余的迭代永远不会发生。您应该删除return mode
,然后在循环结束后将return modeList
放在函数的顶层。
第二个问题是关于上一个循环中的计数,索引和值的逻辑非常破碎。它在某些时候是有效的,因为您正在测试的输入往往具有也是有效索引的计数,但它几乎是偶然的。您要做的是找到最大计数,然后查找具有该计数的所有值。如果您zip
输入列表L
和shows
列表,则可以避免使用索引:
max_count = max(shows)
for item, count in zip(L, shows):
if count == max_count and item not in modeList:
print("mode =", item)
modeList.append(item)
return modeList
虽然这应该解决你所遇到的直接问题,但我觉得我应该建议一个更快,更高效的替代实现(更不用说需要更少的代码)。您可以使用list.count
计算O(N**2)
时间,而不是使用collections.Counter
查找列表中每个值的出现次数(这需要O(N)
次) 。其余的代码也可以简化一下:
from collections import Counter
def mode(L):
counter = Counter(L)
max_count = max(counter.values())
return [item for item, count in counter.items() if count == max_count]