这很可能以前曾被问过,但我似乎无法找到直接的解决方案。假设我在列表中有一堆数字,如:
1234
2233
3232
1234
我需要找到一种方法来使用脚本打印列表中项目的频率总和,如下所示:
1234 2
2233 1
3232 1
有人可以为我阐明这一点吗?
谢谢
答案 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
之类的对象(从技术上讲,Counter
是dict
的子类)。这意味着您可以执行以下操作:
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)]