我正在尝试编写一个程序,该程序将向我显示列表中最常出现的数字。我试图做到这一点,而无需导入任何库。到目前为止,我有一些东西可以给我显示最频繁#出现的次数,但是我想要这个数字本身,而不是它出现多少次。我该如何以一种简单的方式来改变我目前拥有的东西?
<?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。
答案 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)
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}}和索引d
:i
的元组列表。我们使用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