Python 3 - 查找列表模式

时间:2015-07-12 04:48:50

标签: python python-3.x

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的尝试,有人可以填写空白吗?

1 个答案:

答案 0 :(得分: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]