0%

Python_Counter

Counter类是一个用来统计元素频率的容器类别:

教学地址

Counter是什么?

Counter类是一个用来统计元素频率的容器类别,其是一个无序的容器类型,利用的键值对的形式存储,元素作为键,频率作为值.需要注意的是这里的频率可以为负数.

Counter的构建

Counter 提供了多种构建方式,属于符合Python风格的类别.

1
2
3
4
>>> c = Counter() # 創建一個空的Counter類
>>> c = Counter('gallahad') # 從一個可iterable對象(list、tuple、dict、字符串等)創建
>>> c = Counter({'a': 4, 'b': 2}) # 從一個字典對象創建
>>> c = Counter(a=4, b=2) # 從一組鍵值對創建

Counter访问空缺值

Counter实现了__missing__方法,对于没有的键值,会返回0.

1
2
3
4
5
6
7
>>> c = Counter("abcdefgab")
>>> c["a"]
2
>>> c["c"]
1
>>> c["h"]
0

Counter的更新

增加,update()

1
2
3
4
5
6
7
8
>>> c = Counter('which')
>>> c.update('witch') # 使用另一個iterable對象更新
>>> c['h']
3
>>> d = Counter('watch')
>>> c.update(d) # 使用另一個Counter對象更新
>>> c['h']
4

减少,subtract()

1
2
3
4
5
6
7
8
>>> c = Counter('which')
>>> c.subtract('witch') # 使用另一個iterable對象更新
>>> c['h']
1
>>> d = Counter('watch')
>>> c.subtract(d) # 使用另一個Counter對象更新
>>> c['a']
-1

Counter键的删除:del

Counter类键的删除需要 使用del方法,不是使用赋值0操作.

1
2
3
4
5
6
7
8
9
>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> c["b"] = 0
>>> c
Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0})
>>> del c["a"]
>>> c
Counter({'c': 2, 'b': 2, 'd': 1})

Counter返回迭代器:elements()

此方法返回一个迭代器,元素重复多少次,则迭代器中包含有多少个相同元素,并且按照字母序排序.

1
2
3
4
5
elements()方法Python

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

Counter返回 TopN 列表:most_common([n])

返回一个TopN列表,如果n并没有指定,则全部返回.

1
2
3
4
5
>>> c = Counter('abracadabra')
>>> c.most_common()
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
>>> c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

Counter中的算术操作与集合操作: + - & |

1
2
3
4
5
6
7
8
9
10
11
12
13
+、-、&、|操作也可以用於Counter。其中&和|操作分別返回兩個Counter對象各元素的最小值和最大值。需要註意的是,得到的Counter對象將刪除小於1的元素。

Counter對象的算術和集合操作Python
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d # c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d # subtract(只保留正數計數的元素)
Counter({'a': 2})
>>> c & d # 交集: min(c[x], d[x])
Counter({'a': 1, 'b': 1})
>>> c | d # 並集: max(c[x], d[x])
Counter({'a': 3, 'b': 2})

其他操作

1
2
3
4
5
6
7
8
9
sum(c.values()) # 所有計數的總數
c.clear() # 重置Counter對象,註意不是刪除
list(c) # 將c中的鍵轉為列表
set(c) # 將c中的鍵轉為set
dict(c) # 將c中的鍵值對轉為字典
c.items() # 轉為(elem, cnt)格式的列表
Counter(dict(list_of_pairs)) # 從(elem, cnt)格式的列表轉換為Counter類對象
c.most_common()[:-n:-1] # 取出計數最少的n個元素
c += Counter() # 移除0和負值