关于python:如何计算唯一标签的出现次数?

How do I count occurences of a unique label?

本问题已经有最佳答案,请猛点这里访问。

我有一个文档,它由如下标签组成:

1
2
3
4
5
6
7
201
202
205
201
203
204
201

如果我想计算每个标签的出现次数并将其打印出来,如何在Python中这样做?

我想得到的是:

1
2
3
201: 3
202: 1
204: 1

使用来自collections模块的Counter将密钥映射为带计数的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>> from collections import Counter
>>>
>>> s
'202
205
201
203
204
201
'

>>> s = '''
201
202
205
201
203
204
201
'''

>>> c=Counter()
>>> for d in s.rstrip().split():
        c[d] += 1


>>> c
Counter({'201': 3, '205': 1, '204': 1, '203': 1, '202': 1})

或者按照关凯文的建议:

1
>>> c = Counter(s.rstrip().split())

编辑:

我认为这可以进一步简单地做到,这样:

1
2
3
4
5
6
7
8
9
10
11
12
>>> l = s.rstrip().split()
>>> l
['201', '202', '205', '201', '203', '204', '201']
>>> c = [l.count(x) for x in l]
>>>
>>> c
[1, 1, 1, 3, 1]
>>>
>>> d = dict(zip(l,c))
>>>
>>> d
{'205': 1, '201': 3, '203': 1, '204': 1, '202': 1}

如果你喜欢一个线性表达,那么:

1
2
3
4
5
6
7
>>> l = s.rstrip().split()
>>>
>>> dict(zip(l,map(l.count, l)))
{'205': 1, '204': 1, '201': 3, '203': 1, '202': 1}
>>>
>>> dict(zip(set(l),map(l.count, set(l))))
{'205': 1, '201': 3, '203': 1, '204': 1, '202': 1}


试试这个:

1
2
3
4
5
6
import itertools

with open("your_document") as f:
    lines = sorted(map(str.int, f.read().strip().split()))
    for x,y in itertools.groupby(lines):
        print x, list(y)

如果您的文档像GB一样大

1
2
3
4
5
import collections
my_dict = collections.defaultdict(int)
with open("your_document") as f:
    for line in f:
        my_dict[line] += 1

输出:

1
2
>>> my_dict
defaultdict(<type 'int'>, {'201': 2, '203': 1, '202': 1, '205': 1, '204': 1})

没有集合或itertools:

1
2
3
4
5
my_dict = {}
with open("your_document") as f:
    for line in f:
        line = line.strip()
        my_dict[line] = my_dict.get(line, 0) + 1


您可以使用readlines()方法返回行列表,然后使用collections模块中的Counter返回每个"标签"的计数。

1
2
3
4
5
>>> with open('text.txt') as f:
...     c = Counter(map(str.strip, f.readlines()))
...     print(c)
...
Counter({'201': 3, '205': 1, '202': 1, '204': 1, '203': 1})