列表中频率最高的数字

时间:2018-09-05 22:37:36

标签: python python-3.x python-2.7 list counter

我正在尝试编写一个程序,该程序将向我显示列表中最常出现的数字。我试图做到这一点,而无需导入任何库。到目前为止,我有一些东西可以给我显示最频繁#出现的次数,但是我想要这个数字本身,而不是它出现多少次。我该如何以一种简单的方式来改变我目前拥有的东西?

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape android:shape="oval">
            <solid android:color="@color/colorAccent" />
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

编辑:例如,freq([4,6,4,3,9,1,4,4])返回3,因为4出现了3次。但是我希望它以最频繁的值返回4。

5 个答案:

答案 0 :(得分:2)

尝试词典

def freq(L):
     st = {}
     for i in set(L):
        st.update({L.count(i):i})
     print (st.get(max(st)))

或更短:

def freq(L):
    st={L.count(i):i for i in set(L)}
    print (st.get(max(st)))

另一个没有字典的解决方案:

def freq(L):
    a=0
    b=None
    for e in set(L):
        if L.count(e)>a:
            a=L.count(e)
            b=e
    print(b)

答案 1 :(得分:1)

给定列表中的 n 值,

list.count具有O( n )复杂度。如果存在 m 个唯一值,则意味着您的算法将具有最小的O( m x n )复杂度。这是不可取的。

一个O( n )解决方案是创建一个计数字典并在迭代时增加值:

lst = [1, 2, 3, 3, 3, 2, 1, 3, 3]

def freq(L):
    d = {}
    for num in L:
        d[num] = d.get(num, 0) + 1
    maxcount = max(d.values())
    return next(k for k, v in d.items() if v == maxcount)

freq(lst)  # 3

当然,对于collections.Counter来说,语法很简单:

from collections import Counter

def freq(L):
    return Counter(L).most_common()[0][0]

答案 2 :(得分:1)

这是使用列表理解的一种方法:

mostFrequentNumber = L[max([(L.count(d), i) for i, d in enumerate(L)])[1]]

要分解它:

我们迭代该列表的枚举版本: i, d in enumerate(L),它将生成具有值和索引的元组。然后,我们创建一个具有count的{​​{1}}和索引di的元组列表。我们使用Max函数来获得计数最高的那个。然后,我们使用元组中索引(L.count(d), i)的最大值对列表L进行索引。

此输入:[1]将产生结果1,尽管可能不是最有效的。

答案 3 :(得分:0)

我认为这是解决问题的最简单方法:

from statistics import mode

def freq(L):
    return mode(L) 

答案 4 :(得分:0)

使用字典 st = [] 代替列表 dt = {}。 此外,在您的情况下,在 set 上循环性能比遍历所有 list 元素要好,count 方法为您做到了这一点,只需循环 set反而。 最后得到字典dt的最大值索引:

def freq(L):
    dt = {}
    for i in set(L):
        dt[i] = L.count(i)
    return max(dt, key=lambda k: dt[k])

print(freq([4, 6, 4, 3, 9, 1, 4])) #4