アセンブリモジュールcollections


collectionsはPython内に構築された集合モジュールであり、多くの有用な集合クラスを提供しています.
namedtuple
tupleは不変の集合を表すことができることを知っています.例えば、1つの点の2次元座標は次のように表すことができます.
>>> p = (1, 2)

しかし、(1,2)を見ると、このtupleが座標を表すために使われていることはわかりにくい.
classを定義してまた大きな問題をしました.その時、namedtupleは役に立ちました.
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

namedtupleは、カスタムtupleオブジェクトを作成し、tuple要素の個数を規定し、インデックスではなく属性でtupleの要素を参照できる関数です.
これにより、namedtupleを使用すると、tupleの不変性を備え、属性に基づいて参照することができ、非常に便利なデータ型を簡単に定義することができます.
作成されたPointオブジェクトがtupleのサブクラスであることを確認できます.
>>> isinstance(p, Point)
True
>>> isinstance(p, tuple)
True
   ,              ,    namedtuple  :
namedtuple('  ', [  list]):

Circle = namedtuple('Circle', ['x', 'y', 'r'])

deque
リストを使用してデータを格納する場合、インデックスによる要素へのアクセスは速いが、リストが線形格納であるため、リストが大きい場合、挿入と削除の効率は低い.
dequeは、挿入および削除操作を効率的に実現するための双方向リストであり、キューおよびスタックに適しています.
>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

dequeはlistのappend()とpop()に加えてappendleft()とpopleft()をサポートし、ヘッダに要素を非常に効率的に追加または削除することができます.
defaultdict(keyエラーがないためKeyError)
dictを使用する場合、参照するKeyが存在しない場合、KeyErrorが放出されます.keyが存在しない場合、デフォルト値を返すにはdefaultdictを使用します.
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1  
'abc'
>>> dd['key2'] # key2   ,     
'N/A'

デフォルト値は呼び出し関数で返され、defaultdictオブジェクトの作成時に関数が入力されます.
キーが存在しない場合にデフォルト値を返す以外は、defaultdictの他の動作はdictと全く同じです.
OrderedDict
dictを使用する場合、Keyは無秩序です.dictを反復すると、Keyの順序を決定できません.
キーの順序を維持するには、OrderedDictを使用します.
>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict Key    
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict Key    
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

OrderedDictのキーは、キー自体がソートされていない挿入順に並べられます.
>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> list(od.keys()) #      Key     
['z', 'y', 'x']

OrderedDictは、FIFO(先行先出)のdictを実現することができ、容量が制限を超えた場合、最初に追加したKeyを削除します.
from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
    super(LastUpdatedOrderedDict, self).__init__()
    self._capacity = capacity

def __setitem__(self, key, value):
    containsKey = 1 if key in self else 0
    if len(self) - containsKey >= self._capacity:
        last = self.popitem(last=False)
        print('remove:', last)
    if containsKey:
        del self[key]
        print('set:', (key, value))
    else:
        print('add:', (key, value))
    OrderedDict.__setitem__(self, key, value)

ChainMap
ChainMapは、dictのセットを直列に接続し、論理的なdictを構成することができる.ChainMap自体もdictですが、検索すると、内部のdictの順に検索されます.
ChainMapはいつ使うのが一番いいですか?例を挙げると、アプリケーションはパラメータを入力する必要があります.パラメータはコマンドラインで入力できます.環境変数で入力できます.デフォルトのパラメータもあります.パラメータの優先順位検索はChainMapで実現できます.すなわち、コマンドラインパラメータを先に調べ、入力がなければ環境変数を調べ、なければデフォルトパラメータを使用します.
次のコードでは、userとcolorの2つのパラメータを検索する方法を示します.
from collections import ChainMap
import os, argparse

#       :
defaults = {
    'color': 'red',
    'user': 'guest'
}

#        :
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = { k: v for k, v in vars(namespace).items() if v }

#    ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)

#     :
print('color=%s' % combined['color'])
print('user=%s' % combined['user'])
       ,       :

$ python3 use_chainmap.py 
color=red
user=guest
         ,         :

$ python3 use_chainmap.py -u bob
color=red
user=bob
              ,           :

$ user=admin color=green python3 use_chainmap.py -u bob
color=green
user=bob

Counter
Counterは単純なカウンタです.たとえば、統計文字が表示される個数です.
>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
...     c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})

Counterは実際にはdictのサブクラスでもあり、上記の結果から、文字'g'、'm'、'r'が2回ずつ現れ、他の文字が1回ずつ現れていることがわかります.
小結collectionsモジュールは、必要に応じて選択できるいくつかの有用な集合クラスを提供します.
リファレンスソース
use_collections.py