collections[1]
前書き
今回は、colllectionsライブラリを紹介します。collectionsライブラリには、以下の便利なデータ構造が用意されています。
- namedtuple
- deque
- ChainMap
- Counter
- OrderDict
- defaultdict
今回は、namedtuple・deque・ChainMapの3つについて紹介します。
namedtuple
namedtupleは、属性名によるアクセスを可能にしたtupleです。namedtupleは、クラスではなく、ファクトリ関数であるため使い方には少し注意が必要です。
端的に言うと、ファクトリ関数とは、あるクラスを返す関数です。詳しく知りたい方は、デザインパターンを調べると参考になります。
from collections import namedtuple nt = namedtuple('Number', ('one', 'two', 'three')) # typenameというtupleのsubclassを返す number = nt(*[1, 2, 3]) # インスタンスの作成 nt(1, 2, 3)と同じ意味 print(number.one, number.two, number.three) # 属性名でアクセス one, two, three = number # アンパック print(one, two, three)
1 2 3 # print(number.one, number.two, number.three) 1 2 3 # print(one, two, three)
deque
dequeは、双方向から値の出し入れが行えるlistのようなものです。
from collections import deque d = deque(i for i in range(10)) print(d.pop(), d.popleft()) # d.popleft(): 最左端から値を出す print(d) d.append(0) d.appendleft(9) # 最左端に値を入れる print(d)
9 0 # print(d.pop(), d.popleft()) deque([1, 2, 3, 4, 5, 6, 7, 8]) # print(d) deque([9, 1, 2, 3, 4, 5, 6, 7, 8, 0]) # print(d)
ChainMap
ChainMapは、複数の辞書やマッピングを連結できるデータ構造です。
from collections import ChainMap number = ChainMap() odd_number = {'one': 1, 'three': 3, 'five': 5} even_number = {'two': 2, 'four': 4, 'six': 6} number.update(odd_number) number.update(even_number) print(number)
ChainMap({'one': 1, 'three': 3, 'five': 5, 'two': 2, 'four': 4, 'six': 6}) # print(number)
new_childメソッドにより、dictのサブクラスのオブジェクトとdictのオブジェクトを一様に扱うことができます。
# 先程の例の続き print(number['seven']) class ExtendDict(dict): def __missing__(self, key): return f'{key} not found' def __repr__(self): return 'ExtendDict()' ed = ExtendDict() number = number.new_child(ed) print(number) print(number['seven'])
KeyError: 'seven' # print(number['seven']) ChainMap(ExtendDict(), {'one': 1, 'three': 3, 'five': 5, 'two': 2, 'four': 4, 'six': 6}) # print(number) seven not found # print(number['seven'])
最後に
お疲れ様でした。次回は、残りの3つについて紹介します。