2017-05-17

使用 Python Counter 計數器

Python Counter 為 dict 的 subclass,key 的限制不變,value 固定為 int,用來統計 key 的出現次數,或者說是 key 被放入的次數。
from collections import Counter

c = Counter('Apple')
print(sorted(c.items())) # [('A', 1), ('e', 1), ('l', 1), ('p', 2)]

c['A'] += 1
print(sorted(c.items())) # [('A', 2), ('e', 1), ('l', 1), ('p', 2)]

c['A'] = -5 # 可以使用負數
print(sorted(c.items())) # [('A', -5), ('e', 1), ('l', 1), ('p', 2)]

print(c['X']) # 0,遇到不存在的 key 回傳 0

建立 Counter

有許多方式可以建立 Counter。

用 value 為 int 的 dict。

from collections import Counter
c = Counter({ 'apple': 3, 'banana': 5})
print(sorted(c.items())) # [('apple', 3), ('banana', 5)]
用 Keyword argument 建立 Counter。
from collections import Counter
c = Counter(apple=3, banana=5)
print(sorted(c.items())) # [('apple', 3), ('banana', 5)]
用 list 建立 Counter,加總重複的 item。
from collections import Counter
c = Counter(['apple', 'banana', 'apple'])
print(sorted(c.items())) # [('apple', 2), ('banana', 1)]
用 set 建立 Counter。
from collections import Counter
c = Counter({'apple', 'banana', 'apple'})
print(sorted(c.items())) # [('apple', 1), ('banana', 1)]

將 Counter 變成 Bag

利用 Counter.elements() 可以得到一袋的 item。
from collections import Counter
c = Counter({ 'apple': 2, 'banana': 3})
print(sorted(c.items())) # [('apple', 2), ('banana', 3)]
print(sorted(c.elements())) # ['apple', 'apple', 'banana', 'banana', 'banana']

取得出現頻率最高的 item

利用 Counter.most_common(N) 可以得到出現頻率前 N 大的 item。
from collections import Counter
c = Counter('azsxszaaxsaszasa')
print(sorted(c.items())) # [('a', 6), ('s', 5), ('x', 2), ('z', 3)]
print(c.most_common(2)) # [('a', 6), ('s', 5)]

Counter 減去 Counter

有兩個方式可以執行 Counter 減 Counter,使用運算子 - 與 Counter.subtract(),但要小心運算子 - 是回傳新的 Counter,而 Counter.subtract() 是修改原 Counter 物件,並回傳 None。
from collections import Counter
c1 = Counter('azsxszaaxsaszasa')
c2 = Counter('sxszaxsa')
print(sorted(c1.items())) # [('a', 6), ('s', 5), ('x', 2), ('z', 3)]
print(sorted(c2.items())) # [('a', 2), ('s', 3), ('x', 2), ('z', 1)]
c3 = c1 - c2;
print(sorted(c3.items())) # [('a', 4), ('s', 2), ('z', 2)]
c2.subtract(c1);
print(sorted(c2.items())) # [('a', -4), ('s', -2), ('x', 0), ('z', -2)]

官方文件
---
---
---

2 則留言: