Python:列表中出现最多的值

Python:列表中出现最多的值,python,list,Python,List,我有两个清单如下 x = ['a','a','b','c','b','a'] 及 我试图找出这些列表中出现最多的值。这就是我尝试过的 def unique_values(output,input): for i in input: if i not in output: output.append(i) k = [] for i in k: unique_values(k,x) y.remove(i) 我已经完成了这一步,但在删

我有两个清单如下

x = ['a','a','b','c','b','a']

我试图找出这些列表中出现最多的值。这就是我尝试过的

def unique_values(output,input):
    for i in input:
        if i not in output:
            output.append(i)
k = []
for i in k:
    unique_values(k,x)
    y.remove(i)

我已经完成了这一步,但在删除列表中的所有值之前,我不知道如何停止I in k:的

如果要查找列表中每个元素的出现情况,可以使用
集合中的
计数器
模块:-

>>> x = ['a','a','b','c','c','d']

>>> from collections import Counter
>>> count = Counter(x)
>>> count
Counter({'a': 2, 'c': 2, 'b': 1, 'd': 1})
>>> count.most_common()
[('a', 2), ('c', 2), ('b', 1), ('d', 1)]
因此,前两个元素在列表中是最常见的

>>> count.most_common()[0]
('a', 2)
>>> count.most_common()[1]
('c', 2)
或者,您还可以将参数传递给
most_common()
,以指定需要多少
最常见的
元素:-

>>> count.most_common(2)
[('a', 2), ('c', 2)]
更新:-

您还可以先找到
max
计数,然后找到具有该值的元素总数,然后将其用作
most_common()
中的参数:-

>>> freq_list = count.values()
>>> freq_list
[2, 2, 1, 1]
>>> max_cnt = max(freq_list)
>>> total = freq_list.count(max_cnt)

>>> most_common = count.most_common(total)
[('a', 2), ('c', 2)]

>>> [elem[0] for elem in most_common]
['a', 'c']

下面是另一个解决方案:

max(zip((x.count(item) for item in set(x)), set(x)))
首先,我们使用set获得一个不包含重复元素的集合

>>> set(x)
{'a', 'c', 'b'}
然后,我们计算每个元素在x中的次数。这将返回一个生成器对象,您可以将其设置为列表以查看其值(通过使用“[…]”而不是“(…)”),它将返回[3,1,2]

>>> (x.count(item) for item in set(x))
然后,我们进行计数,并使用zip将其与元素配对。第一步的出现次数,用于下一步。您可以使用列表(…)查看其值,它将返回[(3,'a'),(1,'c'),(2,'b')]

最后,我们使用max找出哪一对出现的次数最多

>>> max(zip((x.count(item) for item in set(x)), set(x)))
(3, 'a')
至于第二个值,解决方案有点长。上述内容在列表中使用:

>>> [mitem for mitem in zip((x.count(item) for item in set(x)),set(x)) if mitem[0] == max((x.count(item) for item in set(x)))]
[(2, 'a'), (2, 'c')]

“对于k中的i”==“对于[](不会运行)中的i,您可以从集合导入计数器检查:
;打印计数器(x)。most_common()[0]
@MartjinPieters:
。most_common(1)
max()
可以比
sorted(reverse=True)[0]
快。为什么有人要将计数器重命名为cntr?这是非常不和谐的。不必使用slice来获取列表中的最常见项。只需在most_common(n)中支持n即可@ShawnZhang..是的,对。我只是使用了它,因为有两个最常见的元素。不过我会添加它。注意:如果
len(x)
很大,那么
count。最常见的(2)
count.most\u common()[:2]更有效
是否有任何方法可以更改
x
,但确保即使只有一个或多个最常见的,它仍然会生成所有最常见的?就在语句之后,在三个括号之后。例如:…)[-1]解决方案是
O(N**4)
即使对于中等大小的列表,例如。,
N=1000
需要
~10**12
操作。您可以轻松地将其改进为
O(N**2)
,这与
Counter()
相比仍然很糟糕,后者提供
O(N*log m)
时间复杂度,其中
m
是最常见的元素数。
>>> max(zip((x.count(item) for item in set(x)), set(x)))
(3, 'a')
>>> [mitem for mitem in zip((x.count(item) for item in set(x)),set(x)) if mitem[0] == max((x.count(item) for item in set(x)))]
[(2, 'a'), (2, 'c')]