pythonメニュー

collectionsモージュールの確認

Python 組み込みコンテナ dict, list, set, tuple があります。
collectionsは、これ以外のデータ構造を実装したコンテナ群です。
次のようなものがあります。

ChainMap	複数のマッピングの一つのビューを作成する辞書風のクラス
Counter	ハッシュ可能なオブジェクトを数え上げる辞書のサブクラス
deque	両端における append や pop を高速に行えるリスト風のコンテナ
defaultdict	ファクトリ関数を呼び出して存在しない値を供給する辞書のサブクラス
namedtuple()	名前付きフィールドを持つタプルのサブクラスを作成するファクトリ関数
OrderedDict	項目が追加された順序を記憶する辞書のサブクラス
UserDict	辞書のサブクラス化を簡単にする辞書オブジェクトのラッパ
UserList	リストのサブクラス化を簡単にするリストオブジェクトのラッパ
UserString	文字列のサブクラス化を簡単にする文字列オブジェクトのラッパ


Counter

重複しない要素(一意な要素)の個数(種類)をカウントを「Counter」を使わずに既存の方法で示します。
lst = ['aa', 'aa', 'aa', 'aa', 'bbb', 'c', 'c']
print(lst.count('aa')) # 4 の結果表示
print(lst.count('bbb')) # 1
print(lst.count('c')) # 2
print(lst.count('a'))# 0
上記のように集合から、各要素の数を数えたい場合、collections.Counterを使うと次のよな簡単な記述で可能となる。 (Counterは辞書型dictの継承クラスで、dictと同じ使い方ができ、キーに要素、値に出現回数という形のデータを持つ。)
import collections
counter = collections.Counter(['aa', 'aa', 'aa', 'aa', 'bbb', 'c', 'c'])
print(counter) # Counter({'aa': 4, 'c': 2, 'bbb': 1}) の結果表示
これは、次のように動的に行うこともでます。
import collections
counter = collections.Counter()
for m in ['aa', 'aa', 'aa', 'aa', 'bbb', 'c', 'c']:
    counter.update( [ m ]) # update はリストで追加した情報群に更新するものなので [ ] で囲んでリストにして与えている。

print(counter) # Counter({'aa': 4, 'c': 2, 'bbb': 1}) の結果表示
さて、上記ように生成したcounterは、次のように操作できます。
ks=counter.keys() # キー情報群取得	
vs=counter.values() # 値情報群取得
print(ks,vs) # dict_keys(['bbb', 'c', 'aa']) dict_values([1, 2, 4]) の結果表示
print("sum=",sum(vs)) # sum= 7 の結果表示
a=counter.most_common() # 数が多い順に並び替えたリストを取得(要素は、(キー,個数値)のタプル)
print(type(a), a) #<class 'list'> [('aa', 4), ('c', 2), ('bbb', 1)]の結果表示
print(counter.most_common(2) ) # [('aa', 4), ('c', 2)]の結果表示
最後行のcounter.most_common(2)で、数が多い順に並び替えたリストで先頭2個のタプルを抽出したリストを表示している。

またCounter 同士を足したり、Counter 同士を引いたり、論理和を求めたりできる。