获取列表中项目的频率计数

时间:2015-04-28 04:02:18

标签: python

这很可能以前曾被问过,但我似乎无法找到直接的解决方案。假设我在列表中有一堆数字,如:

1234
2233
3232
1234

我需要找到一种方法来使用脚本打印列表中项目的频率总和,如下所示:

1234 2
2233 1
3232 1

有人可以为我阐明这一点吗?

谢谢

3 个答案:

答案 0 :(得分:5)

from collections import Counter
l = [1234,2233,3232,1234]
c = Counter(l)
print c

输出:

Counter({1234: 2, 3232: 1, 2233: 1})

说明:

这利用了collections.Counter。它返回一个dict之类的对象(从技术上讲,Counterdict的子类)。这意味着您可以执行以下操作:

print c[1234]

并获得

的结果
2

如果您没有查找像对象这样的字典,那么您拥有的另一个选项是构建包含值/计数对的元组列表。

zip(Counter(l).keys(), Counter(l).values())

返回如下内容:

[(3232, 1), (2233, 1), (1234, 2)]

在Python 2.7中添加了Counter类。根据您发布到另一个答案的错误,您似乎使用2.6或更早版本。您可以升级到2.7,也可以使用Counter类的backport

您还可以使用defaultdict并计算项目:

from collections import defaultdict

l = [1234,2233,3232,1234]
d = defaultdict(int)

for curr in l:
    d[curr] += 1

print d

d是一个字典,如下所示:

defaultdict(<type 'int'>, {3232: 1, 2233: 1, 1234: 2})

您可以像使用Counter

一样访问它
d[1234]

打印

2

答案 1 :(得分:3)

您可以使用collections.Counter

In [1]: from collections import Counter

In [2]: my_list = [1,3,3,2]

In [3]: Counter(my_list)
Out[3]: Counter({3: 2, 1: 1, 2: 1})

答案 2 :(得分:1)

以下代码

from itertools import groupby

a = [
    1234,
    2233,
    3232,
    1234
]
print [(key, len(list(group))) for key, group in groupby(sorted(a))]

会给你:

  

[(1234,2),(2233,1),(3232,1)]