Python 列表中频率最高的数字
我正在尝试编写一个程序,它将显示列表中最常出现的数字。我正在尝试在不导入任何库的情况下执行此操作。到目前为止,我有一些东西可以告诉我最频繁出现的次数,但我想要的是数字本身,而不是它出现的次数。我怎样才能用一种简单的方式来改变我目前所拥有的Python 列表中频率最高的数字,python,python-3.x,python-2.7,list,counter,Python,Python 3.x,Python 2.7,List,Counter,我正在尝试编写一个程序,它将显示列表中最常出现的数字。我正在尝试在不导入任何库的情况下执行此操作。到目前为止,我有一些东西可以告诉我最频繁出现的次数,但我想要的是数字本身,而不是它出现的次数。我怎样才能用一种简单的方式来改变我目前所拥有的 def freq(L): st = [] L.sort() for i in L: st.append(L.count(i)) print max(st) 编辑:例如,freq([4,6,4,3,9,1,4])
def freq(L):
st = []
L.sort()
for i in L:
st.append(L.count(i))
print max(st)
编辑:例如,freq([4,6,4,3,9,1,4])返回3,因为4出现了3次。但是我希望它返回4作为最常见的值。试试字典
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)
试试字典
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)
list.count
具有O(n)复杂度,给定列表中的n个值。如果有m个唯一值,这意味着您的算法将具有最小的O(mxn)复杂度。这是不可取的
一个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]
list.count
具有O(n)复杂度,给定列表中的n个值。如果有m个唯一值,这意味着您的算法将具有最小的O(mxn)复杂度。这是不可取的
一个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]
下面是一种使用列表理解的方法:
mostFrequentNumber=L[max([(枚举(L)中i,d的L.count(d),i)])[1]]
要分解它:
我们迭代列表的枚举版本:
i,枚举(L)
中的d,它将生成具有值和索引的元组。然后我们创建一个元组列表,其中包含d
的count
和索引i
:(L.count(d),i)
。我们使用Max函数来获得计数最高的一个。然后,我们使用元组中索引[1]
处的最大值对列表L
进行索引
此输入:
L=[1,1,1,2,3,4]
将产生1,尽管可能不是最有效的。下面是一种使用列表理解的方法:
mostFrequentNumber=L[max([(枚举(L)中i,d的L.count(d),i)])[1]]
要分解它:
我们迭代列表的枚举版本:
i,枚举(L)
中的d,它将生成具有值和索引的元组。然后我们创建一个元组列表,其中包含d
的count
和索引i
:(L.count(d),i)
。我们使用Max函数来获得计数最高的一个。然后,我们使用元组中索引[1]
处的最大值对列表L
进行索引
此输入:
L=[1,1,1,2,3,4]
将产生1,尽管可能不是最有效的。可能是浮点数或严格的整数?使用集合。计数器
替换您编写的大部分代码,这将为您提供一个包含列表中每个项目频率的dict。反转指令。将max
应用于按键。现在只需将其用作反向dict的索引。这将返回一个最频繁的项。当您说“不导入任何库”时,是否包括标准库中的模块,如?如果是这样的话,你为什么要避开那些库呢?这是一个学习练习吗?嗨,你能举一个输入数据和你想要输出的例子吗?@Prune,注意计数器
有一个最常用的
方法,这意味着无需手动计算最大值。可能是浮点数或严格整数?使用集合。计数器
替换您编写的大部分代码,这将为您提供一个dict,其中包含列表中每个项目的频率。反转指令。将max
应用于按键。现在只需将其用作反向dict的索引。这将返回一个最频繁的项。当您说“不导入任何库”时,是否包括标准库中的模块,如?如果是这样的话,你为什么要避开那些库呢?这是一个学习练习吗?嗨,你能举一个输入数据和你想要输出的例子吗?@Prune,注意计数器
有一个最常用的
方法,这意味着不需要手动计算最大值。