2015-07-12 55 views
-2
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) 

我似乎无法通过我的列表中正常遍历...... 我能顺利拿到第一个模式,但是循环使用第二返回Mode = 87,我可以不要让它搜索列表的其余部分,这样它也将返回Mode = 92的Python 3 - 查找列表的方式

我已经删除了我的尝试Mode = 92,有人可以帮忙填补空白吗?

+0

你能显示你正在测试的列表吗?没有这些,你对87和92等具体数值的引用就没有多大意义。 – Blckknght

+0

L = [98,75,92,87,89,90,92,87] – ARW

+0

我不太明白你要完成什么,但是在“我在节目中:”同样的事情是在“如果modeList == []:“,并且当”elif模式不在modeList:“中,因此它们可以组合成一个”if modeList == []或mode mode not in modeList:“ – 2015-07-12 08:22:38

回答

2

您的代码的第一个问题是您的循环中有一个return声明。当它到达时,函数结束,其余的迭代不会发生。在循环结束后,您应该删除return mode,而不是将return modeList置于该函数的顶层。

第二个问题是,你在上一次循环中关于计数,索引和值的逻辑非常破碎。它在某些时候是有效的,因为你正在测试的输入往往有计数,这也是有效的索引,但它几乎是偶然的。你想要做的是找到最大数量,然后找到所有具有该数量的值。如果您zip输入列表Lshows名单一起,你能避免使用索引都:

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]