collections.Counterの使用例

だいぶ前に defaultdict について書いたけど、出現回数のカウントは collections.Counter クラスの方がシンプルに書ける。

# Python 3.2.2
from collections import Counter
c = Counter('abrakadabra')
for k, v in c.items():
    print(k, '----', v)
# 結果:
#   a ---- 5
#   r ---- 2
#   b ---- 2
#   k ---- 1
#   d ---- 1

Counter クラスは dict を継承しているので、基本的な使い勝手は辞書と同じである。

c = Counter(red=3, green=4, blue=5)
print(c)  # Counter({'blue': 5, 'green': 4, 'red': 3})
c.update(['red', 'red', 'green', 'blue', 'blue', 'blue'])
print(c)  # Counter({'blue': 8, 'green': 5, 'red': 5})

さらに Counter クラスでは「数え上げた後」のことも考えられている。例えば Counter 同士を足したり、

storeA = Counter(pencil=10, eraser=5, ruler=3)
storeB = Counter(pencil=3, eraser=1)
# 在庫の合計を求める
whole = storeA + storeB
print(whole)  # 結果: Counter({'pencil': 13, 'eraser': 6, 'ruler': 3})

Counter 同士を引いたり、

stock = Counter(pencil=10, eraser=5, ruler=3)
sales = Counter(pencil=3, eraser=1)
# 売れ残った数を求める
rest = stock - sales
print(rest)  # 結果: Counter({'pencil': 7, 'eraser': 4, 'ruler': 3})

論理和を求めたりできる。

mon = Counter(car=3, bike=2, tricycle=1)
tue = Counter(car=2, bike=4)
wed = Counter(tricycle=3)
# 必要最低数を求める
least_demand = mon | tue | wed
print(least_demand)  # 結果: Counter({'bike': 4, 'car': 3, 'tricycle': 3})

他にも使用例が思い浮かばないような機能がたくさんある。