序列中元素个数的计算

在需要计算一个序列中的每个元素的出现的次数时,就拿最常见的列表来说,如果只通过列表中提供的count方法来计算某个元素出现的次数很难将元素和次数组合在一起.

在collections提供的Counter类就很好的解决了这一类问题,来看看它是如何实现元素的计数,并将元素与个数对应起来的吧

1
2
3
4
5
6
7
8
9
from collections import Counter

a = ['a', 'b', 'b', 'a', 'c', 'd', 'a']
counter = Counter(a)
top = counter.most_common(1) # counter的实例调用most_common方法可以实现计算序列中前多少数量的元素
detail_info = counter['a'] # 可以单独查询某个元素出现的次数,和list.count效果相同
print(counter)
print(top)
print(detail_info)
1
2
3
Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
[('a', 3)]
3

可以看到Counter对象将元素与个数很好的对应起来了,需要注意的是作为Counter参数的序列元素必须要可哈希的,不然是无法处理的.

值得注意的是Counter对象还可以与数学运算结合起来,如

1
2
3
4
5
6
7
8
a = ['a', 'b', 'b', 'a', 'c', 'd', 'a']
b = ['a', 'd', 'e', 'g', 'z', 'a', 'a']
counter1 = Counter(a)
counter2 = Counter(b)
add = counter1 + counter2
sub = counter1 - counter2
print(add)
print(sub)
1
2
Counter({'a': 6, 'b': 2, 'd': 2, 'c': 1, 'e': 1, 'g': 1, 'z': 1})
Counter({'b': 2, 'c': 1})

加法可以将两个不同的对象相结合起来,但是如果是减法两个对象中都没有的元素进行相减不会有任何结果也没有输出.