Python collectionsモジュールのコンテナデータ型入門|deque・Counter・ChainMapの使い方
Pythonの標準ライブラリであるcollectionsモジュールには、dictやlist、setといった汎用的な組み込みコンテナの代わりに使える、目的に特化したコンテナデータ型が複数用意されています。
代表的なコンテナは以下のとおりです。
| 番号 | コンテナと説明 |
|---|---|
| 1 | namedtuple() 名前付きフィールドを持つタプルのサブクラスを作成します |
| 2 | deque リスト型のデータを利用した両端キューです |
| 3 | Counter ハッシュ可能なオブジェクトの出現回数を数えるdictのサブクラスです |
| 4 | ChainMap 複数のマッピングを1つのビューとしてまとめます |
| 5 | OrderedDict 要素が追加された順序を保持するdictのサブクラスです |
| 6 | UserList listをラップしてより扱いやすくしたクラスです |
このモジュールを使用するには、まず次のようにインポートします。
import collections
deque(デック)オブジェクト
dequeは、スタックとキューの性質を兼ね備えた汎用的なデータ構造で、左から右へ向かって初期化されます。内部ではリストオブジェクトを利用してdequeを生成します。両端への要素の追加・削除が高速に行えるのが大きな特徴です。
dequeに関連する主なメソッドは以下のとおりです。
| 番号 | メソッドと説明 |
|---|---|
| 1 | append(x) dequeの右端に要素xを追加します |
| 2 | appendleft(x) dequeの左端に要素xを追加します |
| 3 | clear() dequeの全要素を削除します |
| 4 | count(x) deque内にxが出現する回数を数えます |
| 5 | index(x[, start[, stop]]) xの位置を返します。startとstopが指定されている場合は、その範囲内で検索します |
| 6 | insert(i, x) 位置iに要素xを挿入します |
| 7 | pop() 右端から要素を取り除き、その値を返します |
| 8 | popleft() 左端から要素を取り除き、その値を返します |
| 9 | reverse() dequeの内容を逆順に並べ替えます |
| 10 | rotate(n = 1) dequeを右方向にn回回転させます |
サンプルコード
import collections as col
my_deque = col.deque('124dfre')
print(my_deque)
print("Popped Item: " + str(my_deque.pop()))
print("Popped Item From Left: " + str(my_deque.popleft()))
print(my_deque)
実行結果
deque(['1', '2', '4', 'd', 'f', 'r', 'e']) Popped Item: e Popped Item From Left: 1 deque(['2', '4', 'd', 'f', 'r'])
Counter(カウンター)オブジェクト
Counterはdict型のサブクラスで、キーの出現回数を数えるために使用します。値として扱えるのは整数のみという点が特徴です。
Counterに関連する主なメソッドは以下のとおりです。
| 番号 | メソッドと説明 |
|---|---|
| 1 | elements() 各要素を、そのカウント値の回数だけ繰り返し返すイテレータを返します |
| 2 | most_common([n]) 出現頻度の高い上位n個の要素をリストで返します。nが指定されない場合はすべての要素を返します |
| 3 | subtract(iterable または mapping) キーが一致する要素同士でカウント値を減算します |
| 4 | update(iterable または mapping) キーが一致する要素について、既存の値を置き換えずに加算します |
サンプルコード
import collections as col
text_list = ['ABC','PQR','ABC','ABC','PQR','Mno','xyz','PQR','ABC','xyz']
my_counter = col.Counter()
for element in text_list:
my_counter[element] += 1
print(my_counter)
print(my_counter.most_common(2))
実行結果
Counter({'ABC': 4, 'PQR': 3, 'xyz': 2, 'Mno': 1})
[('ABC', 4), ('PQR', 3)]
ChainMap(チェーンマップ)オブジェクト
ChainMapは、複数の辞書を1つのまとまりとして扱うためのクラスです。キーの検索時には、チェーンの先頭にあるマッピングから順に参照されます。
ChainMapの主なメンバーは以下のとおりです。
| 番号 | メンバーと説明 |
|---|---|
| 1 | maps キーとそれに対応する値の一覧を返します |
| 2 | new_child(m = None) チェーンの先頭に新しい辞書を挿入します |
サンプルコード
import collections as col
con_code1 = {'India' : 'IN', 'China' : 'CN'}
con_code2 = {'France' : 'FR', 'United Kingdom' : 'GB'}
code = {'Japan' : 'JP'}
chain = col.ChainMap(con_code1, con_code2)
print("Initial Chain: " + str(chain.maps))
chain = chain.new_child(code) # 新しい子マップを挿入
print("Final Chain: " + str(chain.maps))
実行結果
Initial Chain: [{'India': 'IN', 'China': 'CN'}, {'France': 'FR', 'United Kingdom': 'GB'}]
Final Chain: [{'Japan': 'JP'}, {'India': 'IN', 'China': 'CN'}, {'France': 'FR', 'United Kingdom': 'GB'}]
-
Pythonで解く「最大の水を溜められるコンテナ」問題 ― 二ポインタ法による効率的な実装
問題の概要n個の非負整数 a1, a2, ..., an が与えられ、それぞれの値は座標 (i, a[i]) 上の点を表すものとします。i番目の縦線は、端点 (i, a[i]) と (i, 0) を結ぶ線分です。この中から2本の線を選び、x軸とともにコンテナ(容器)を形成したときに、最も多くの水を溜められる組み合わせを見つけるのがこの問題の目的です。例えば、配列が [1,8,6,2,5,4,8,3,7] の場合を考えてみましょう。図の網掛け部分では、高さが7、横幅が7区間あるため、合計面積は 7 × 7 = 49 となります。これが求める出力です。解法のアプローチ(二ポインタ法)この問題は「二
-
【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説
はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが