我有两个列表如下
x = ['a','a','b','c','b','a']
和
x = ['a','a','b','c','c','d']
我正试图找出每个列表中出现最多的值。这就是我的尝试。
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)
我已经做到这一点,但我无法弄清楚如何在删除列表中的所有值之前停止for i in k:
。
答案 0 :(得分:34)
如果要查找列表中每个元素的出现位置,可以使用Counter
中的collections
模块: -
>>> 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()
以指定所需的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']
答案 1 :(得分:0)
这是另一种解决方案:
max(zip((x.count(item) for item in set(x)), set(x)))
首先,我们使用set获得一个不包含重复元素的集合。
>>> set(x)
{'a', 'c', 'b'}
然后,我们计算每个元素在x中的次数。这将返回一个生成器对象,你可以使它成为一个列表来查看它的值(通过使用“[...]”代替“(...)”),它将返回[3,1,2]。 / p>
>>> (x.count(item) for item in set(x))
然后,我们采用计数并使用zip将其与元素配对。首先出现的次数,用于下一步。您可以通过使用列表(...)来查看其值,它将返回[(3,'a'),(1,'c'),(2,'b')]。
>>> zip((x.count(item) for item in set(x)), set(x))
最后,我们使用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')]