python3找到Lis的模式

2024-07-04 17:06:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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上的尝试,有人能帮我填空吗?在


Tags: in列表forifmodedefcountsort
1条回答
网友
1楼 · 发布于 2024-07-04 17:06:57

代码的第一个问题是循环中有一个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)时间。其他代码也可以简化一点:

^{pr2}$

相关问题 更多 >

    热门问题