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})
他にも使用例が思い浮かばないような機能がたくさんある。