如何计算列表中元素的频率?

Bru*_*uce 214 python counter frequency counting

我需要在列表中找到元素的频率

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
Run Code Online (Sandbox Code Playgroud)

输出 - >

b = [4,4,2,1,2]
Run Code Online (Sandbox Code Playgroud)

另外我想从a中删除重复项

a = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 490

在Python 2.7(或更新版本)中,您可以使用collections.Counter:

import collections
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
counter=collections.Counter(a)
print(counter)
# Counter({1: 4, 2: 4, 3: 2, 5: 2, 4: 1})
print(counter.values())
# [4, 4, 2, 1, 2]
print(counter.keys())
# [1, 2, 3, 4, 5]
print(counter.most_common(3))
# [(1, 4), (2, 4), (3, 2)]
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 2.6或更早版本,可以在此处下载.

  • @Pavan:`collections.Counter`是`dict`的子类.您可以像使用普通字典一样使用它.但是,如果你真的想要一个dict,你可以使用`dict(counter)`将它转换为dict. (7认同)
  • 有没有办法从计数器对象中提取字典 {1:4, 2:4, 3:2, 5:2, 4:1} ? (2认同)

Nad*_*mli 130

由于列表是订购的,您可以这样做:

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
from itertools import groupby
[len(list(group)) for key, group in groupby(a)]
Run Code Online (Sandbox Code Playgroud)

输出:

[4, 4, 2, 1, 2]
Run Code Online (Sandbox Code Playgroud)

  • python groupby在它看到的值发生变化时创建新组.在这种情况下,1,1,1,2,1,1,1]将返回[3,1,3].如果你期望[6,1]那么只需确保在使用groupby之前对数据进行排序. (27认同)
  • @CristianCiupitu:`sum(1 for _ in group)`. (4认同)
  • 这不是解决方案.输出并不能说明计算的内容. (4认同)
  • `[(key,len(list(group)))for key,group in(a)]`或`{key:len(list(group))for key,group in groupby(a)}`@buhtz (4认同)

Amj*_*ith 102

Python 2.7+引入了词典理解.从列表中构建字典将获得计数以及删除重复项.

>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> d = {x:a.count(x) for x in a}
>>> d
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
>>> a, b = d.keys(), d.values()
>>> a
[1, 2, 3, 4, 5]
>>> b
[4, 4, 2, 1, 2]
Run Code Online (Sandbox Code Playgroud)

  • **这是非常低效的**.`a.count()`为`a`中的每个元素执行*遍历*,使其成为O(N ^ 2)四元方法.`collections.Counter()`**效率更高**因为它以线性时间(O(N))计算.在数字中,这意味着这种方法将执行100万步骤的长度为1000的列表,而只有1000步骤使用`Counter()`,10 ^ 12步骤,计数器只需要10 ^ 6个步骤清单等 (36认同)
  • 使用set更快:`{x:a.count(x)for x in set(a)}` (12认同)
  • @stenci:当然,但是使用 `a.count()` 的恐怖完全使在那里使用 set 的效率相形见绌。 (4认同)
  • @MartijnPieters 减少使用次数的另一个原因:) (2认同)

Ida*_*n K 47

要计算出现次数:

from collections import defaultdict

appearances = defaultdict(int)

for curr in a:
    appearances[curr] += 1
Run Code Online (Sandbox Code Playgroud)

要删除重复项:

a = set(a) 
Run Code Online (Sandbox Code Playgroud)

  • @hughdbrown,实际上`Counter` 可以使用多种数字类型,包括`float` 或`Decimal`,而不仅仅是`int`。 (3认同)

lin*_*lof 24

计算元素的频率可能最好用字典来完成:

b = {}
for item in a:
    b[item] = b.get(item, 0) + 1
Run Code Online (Sandbox Code Playgroud)

要删除重复项,请使用以下集:

a = list(set(a))
Run Code Online (Sandbox Code Playgroud)

  • @ S.Lott:发布你的答案有什么问题? (10认同)
  • `collections.defaultdict`有什么问题? (7认同)
  • @phkahler:我只会比这更好一点.当一个小的改变可以改善这个问题时,我很难发布一个单独的答案.SO的目的是获得*最佳*答案.我可以简单地编辑它,但我更愿意让原作者有机会做出自己的改进. (3认同)

YOU*_*YOU 23

在Python 2.7+中,您可以使用collections.Counter来计算项目

>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>>
>>> from collections import Counter
>>> c=Counter(a)
>>>
>>> c.values()
[4, 4, 2, 1, 2]
>>>
>>> c.keys()
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)


rbe*_*nto 14

这是另一个简洁的替代方法itertools.groupby,它也适用于无序输入:

from itertools import groupby

items = [5, 1, 1, 2, 2, 1, 1, 2, 2, 3, 4, 3, 5]

results = {value: len(list(freq)) for value, freq in groupby(sorted(items))}
Run Code Online (Sandbox Code Playgroud)

结果

{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
Run Code Online (Sandbox Code Playgroud)


Evg*_*lov 11

你可以这样做:

import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)
Run Code Online (Sandbox Code Playgroud)

输出:

(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))
Run Code Online (Sandbox Code Playgroud)

第一个数组是值,第二个数组是具有这些值的元素数.

所以如果你想得到数字的数组,你应该使用这个:

np.unique(a, return_counts=True)[1]
Run Code Online (Sandbox Code Playgroud)


Lak*_*sad 7

seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
Run Code Online (Sandbox Code Playgroud)

  • 使用列表`count`是非常昂贵的,在这种情况下是不必要的. (4认同)

小智 7

from collections import Counter
a=["E","D","C","G","B","A","B","F","D","D","C","A","G","A","C","B","F","C","B"]

counter=Counter(a)

kk=[list(counter.keys()),list(counter.values())]

pd.DataFrame(np.array(kk).T, columns=['Letter','Count'])
Run Code Online (Sandbox Code Playgroud)


小智 6

我将以以下方式简单地使用scipy.stats.itemfreq:

from scipy.stats import itemfreq

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]

freq = itemfreq(a)

a = freq[:,0]
b = freq[:,1]
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看文档:http : //docs.scipy.org/doc/scipy-0.16.0/reference/generation/scipy.stats.itemfreq.html


job*_*ima 5

数据。假设我们有一个列表:

fruits = ['banana', 'banana', 'apple', 'banana']
Run Code Online (Sandbox Code Playgroud)

解决方案。然后我们可以通过执行以下操作找出列表中每种水果的数量:

import numpy as np    
(unique, counts) = np.unique(fruits, return_counts=True)
{x:y for x,y in zip(unique, counts)}
Run Code Online (Sandbox Code Playgroud)

输出

{'banana': 3, 'apple': 1}
Run Code Online (Sandbox Code Playgroud)