Python Language
コレクションモジュール
サーチ…
前書き
ビルトインcollections
パッケージには、高性能であり、 dict
、 list
、 tuple
、およびset
の一般的なコレクションタイプに代わるものを提供する、いくつかの特殊で柔軟なコレクションタイプが用意set
ます。また、このモジュールは、さまざまなタイプのコレクション機能( MutableSet
やItemsView
)を記述する抽象基本クラスも定義します。
備考
コレクションモジュールには、次の3つのタイプがあります。
- UserDict
- ユーザーリスト
- UserString
それらはそれぞれ、結ばれたオブジェクトの周りのラッパーとして機能します。たとえば、 UserDictはdictオブジェクトの周りのラッパーとして機能します。いずれの場合も、クラスはその名前付き型をシミュレートします。インスタンスの内容は、ラッパー・インスタンスのデータ属性を介してアクセス可能な通常型オブジェクトに保持されます。これらの3つのケースのそれぞれにおいて、これらのタイプの必要性は、基本タイプから直接サブクラス化する能力によって部分的に置き換えられました。ただし、ラッパークラスは、基になる型が属性としてアクセス可能であるため、操作が簡単です。
コレクション。カウンター
Counterはdictサブクラスで、オブジェクトを簡単に数えることができます。それはあなたが数えているオブジェクトの頻度で作業するためのユーティリティメソッドを持っています。
import collections
counts = collections.Counter([1,2,3])
上記のコードは、コンストラクタに渡されるすべての要素の頻度を持つcountsというオブジェクトを作成します。この例では、 Counter({1: 1, 2: 1, 3: 1})
値Counter({1: 1, 2: 1, 3: 1})
コンストラクタの例
レターカウンター
>>> collections.Counter('Happy Birthday')
Counter({'a': 2, 'p': 2, 'y': 2, 'i': 1, 'r': 1, 'B': 1, ' ': 1, 'H': 1, 'd': 1, 'h': 1, 't': 1})
ワードカウンター
>>> collections.Counter('I am Sam Sam I am That Sam-I-am That Sam-I-am! I do not like that Sam-I-am'.split())
Counter({'I': 3, 'Sam': 2, 'Sam-I-am': 2, 'That': 2, 'am': 2, 'do': 1, 'Sam-I-am!': 1, 'that': 1, 'not': 1, 'like': 1})
レシピ
>>> c = collections.Counter({'a': 4, 'b': 2, 'c': -2, 'd': 0})
個々の要素の数を取得する
>>> c['a']
4
個々の要素の数を設定する
>>> c['c'] = -3
>>> c
Counter({'a': 4, 'b': 2, 'd': 0, 'c': -3})
カウンタの合計要素数を取得する(4 + 2 + 0 - 3)
>>> sum(c.itervalues()) # negative numbers are counted!
3
要素を取得する(正のカウンタを持つものだけが保持される)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
0または負の値を持つキーを削除する
>>> c - collections.Counter()
Counter({'a': 4, 'b': 2})
すべてを削除する
>>> c.clear()
>>> c
Counter()
個々の要素を削除する
>>> c.update({'a': 3, 'b':3})
>>> c.update({'a': 2, 'c':2}) # adds to existing, sets if they don't exist
>>> c
Counter({'a': 5, 'b': 3, 'c': 2})
>>> c.subtract({'a': 3, 'b': 3, 'c': 3}) # subtracts (negative values are allowed)
>>> c
Counter({'a': 2, 'b': 0, 'c': -1})
collections.defaultdict
collections.defaultdict (default_factory)は、欠落しているキーのデフォルト値を持つdict
サブクラスを返します。引数は、引数なしで呼び出されたときにデフォルト値を返す関数でなければなりません。何も渡されなければ、デフォルトはNone
ます。
>>> state_capitals = collections.defaultdict(str)
>>> state_capitals
defaultdict(<class 'str'>, {})
default_factoryメソッドで文字列オブジェクトを作成するdefaultdictへの参照を返します。
defaultdict
の典型的な使い方は、引数なしで呼び出されたときに空の型を返すため、 str
、 int
、 list
またはdict
などの組み込み型のいずれかをdefault_factoryとして使用することです。
>>> str()
''
>>> int()
0
>>> list
[]
存在しないキーでdefaultdictを呼び出すと、通常の辞書と同じようにエラーは発生しません。
>>> state_capitals['Alaska']
''
>>> state_capitals
defaultdict(<class 'str'>, {'Alaska': ''})
int
別の例:
>>> fruit_counts = defaultdict(int)
>>> fruit_counts['apple'] += 2 # No errors should occur
>>> fruit_counts
default_dict(int, {'apple': 2})
>>> fruit_counts['banana'] # No errors should occur
0
>>> fruit_counts # A new key is created
default_dict(int, {'apple': 2, 'banana': 0})
通常の辞書のメソッドは、デフォルトの辞書で動作する
>>> state_capitals['Alabama'] = 'Montgomery'
>>> state_capitals
defaultdict(<class 'str'>, {'Alabama': 'Montgomery', 'Alaska': ''})
default_factoryとしてlist
を使用すると、新しいキーごとにリストが作成されます。
>>> s = [('NC', 'Raleigh'), ('VA', 'Richmond'), ('WA', 'Seattle'), ('NC', 'Asheville')]
>>> dd = collections.defaultdict(list)
>>> for k, v in s:
... dd[k].append(v)
>>> dd
defaultdict(<class 'list'>,
{'VA': ['Richmond'],
'NC': ['Raleigh', 'Asheville'],
'WA': ['Seattle']})
コレクション.OrderedDict
Python辞書のキーの順序は任意です。追加する順番に左右されません。
例えば:
>>> d = {'foo': 5, 'bar': 6}
>>> print(d)
{'foo': 5, 'bar': 6}
>>> d['baz'] = 7
>>> print(a)
{'baz': 7, 'foo': 5, 'bar': 6}
>>> d['foobar'] = 8
>>> print(a)
{'baz': 7, 'foo': 5, 'bar': 6, 'foobar': 8}
```
(上で暗示されている任意の順序付けは、上記のコードでここに示したものと異なる結果を得るかもしれないことを意味します)。
キーが現れる順序は、 for
ループを使用するなど、反復される順序です。
collections.OrderedDict
クラスは、キーの順序を保持する辞書オブジェクトを提供します。 OrderedDict
は、一連の注文アイテム(ここでは、タプルのキーと値のペアのリスト)と共に以下のように作成できます。
>>> from collections import OrderedDict
>>> d = OrderedDict([('foo', 5), ('bar', 6)])
>>> print(d)
OrderedDict([('foo', 5), ('bar', 6)])
>>> d['baz'] = 7
>>> print(d)
OrderedDict([('foo', 5), ('bar', 6), ('baz', 7)])
>>> d['foobar'] = 8
>>> print(d)
OrderedDict([('foo', 5), ('bar', 6), ('baz', 7), ('foobar', 8)])
または、空のOrderedDict
を作成して項目を追加することもできます。
>>> o = OrderedDict()
>>> o['key1'] = "value1"
>>> o['key2'] = "value2"
>>> print(o)
OrderedDict([('key1', 'value1'), ('key2', 'value2')])
OrderedDict
反復することで、追加された順序でキーアクセスが可能になります。
既存のキーに新しい値を割り当てるとどうなりますか?
>>> d['foo'] = 4
>>> print(d)
OrderedDict([('foo', 4), ('bar', 6), ('baz', 7), ('foobar', 8)])
キーは、 OrderedDict
元の場所を保持します。
collections.namedtuple
次のようにnamedtuple
を使って新しい型Person
を定義します:
Person = namedtuple('Person', ['age', 'height', 'name'])
2番目の引数は、タプルが持つ属性のリストです。これらの属性は、スペースまたはコンマで区切られた文字列としても表示できます。
Person = namedtuple('Person', 'age, height, name')
または
Person = namedtuple('Person', 'age height name')
一度定義されると、必要なパラメータでオブジェクトを呼び出すことによって、名前付きタプルをインスタンス化することができます。
dave = Person(30, 178, 'Dave')
名前付き引数も使用できます。
jack = Person(age=30, height=178, name='Jack S.')
これで名前付きタプルの属性にアクセスできます。
print(jack.age) # 30
print(jack.name) # 'Jack S.'
namedtupleコンストラクタ(この例では'Person'
)の最初の引数はtypename
です。コンストラクタと型名に同じ単語を使用するのが一般的ですが、それらは異なる場合があります。
Human = namedtuple('Person', 'age, height, name')
dave = Human(30, 178, 'Dave')
print(dave) # yields: Person(age=30, height=178, name='Dave')
collections.deque
iterableのデータを使用して、左から右(append()を使用)で初期化された新しいdeque
オブジェクトを返します。 iterableが指定されていない場合、新しいdeque
は空です。
Dequesはスタックとキューの一般化です(名前は "deck"と発音され、 "double-ended queue"の略です)。 Dequesは、どちらの方向でもほぼ同じO(1)のパフォーマンスでdeque
どちらかからスレッドセーフ、メモリ効率の良い追加とポップをサポートします。
リストオブジェクトは同様の操作をサポートしていますが、固定長の高速操作に最適化されており、基になるデータ表現のサイズと位置の両方を変更するpop(0)およびinsert(0、v)操作のO(n) 。
バージョン2.4の新機能
maxlen
が指定されていない場合、またはNone
場合、dequesは任意の長さに拡大する可能性があります。それ以外の場合、 deque
は指定された最大長に制限されます。有界長deque
が満杯になると、新しい項目が追加されると、対応する数の項目が反対側の端から破棄されます。有界長dequesは、Unixのtailフィルタに似た機能を提供します。最新のアクティビティーのみが関心のあるトランザクションやその他のデータ・プールのトラッキングにも役立ちます。
バージョン2.6で変更:maxlenパラメータを追加。
>>> from collections import deque
>>> d = deque('ghi') # make a new deque with three items
>>> for elem in d: # iterate over the deque's elements
... print elem.upper()
G
H
I
>>> d.append('j') # add a new entry to the right side
>>> d.appendleft('f') # add a new entry to the left side
>>> d # show the representation of the deque
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop() # return and remove the rightmost item
'j'
>>> d.popleft() # return and remove the leftmost item
'f'
>>> list(d) # list the contents of the deque
['g', 'h', 'i']
>>> d[0] # peek at leftmost item
'g'
>>> d[-1] # peek at rightmost item
'i'
>>> list(reversed(d)) # list the contents of a deque in reverse
['i', 'h', 'g']
>>> 'h' in d # search the deque
True
>>> d.extend('jkl') # add multiple elements at once
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1) # right rotation
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1) # left rotation
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> deque(reversed(d)) # make a new deque in reverse order
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear() # empty the deque
>>> d.pop() # cannot pop from an empty deque
Traceback (most recent call last):
File "<pyshell#6>", line 1, in -toplevel-
d.pop()
IndexError: pop from an empty deque
>>> d.extendleft('abc') # extendleft() reverses the input order
>>> d
deque(['c', 'b', 'a'])
ソース: https : //docs.python.org/2/library/collections.html
コレクション.ChainMap
ChainMap
はバージョン3.3で新しく追加されました
いくつかのmaps
持つ新しいChainMap
オブジェクトを返します。このオブジェクトは、複数のdictsまたは他のマッピングをまとめてグループ化し、更新可能な単一のビューを作成します。
ChainMap
はネストされたコンテキストやオーバーレイを管理するのに便利です。 Pythonの世界の例は、DjangoのテンプレートエンジンのContext
クラスの実装にあります。結果が単一の単位として扱われるように、多数のマッピングを素早くリンクするのに便利です。新しい辞書を作成し、複数のupdate()
呼び出しを実行するよりもはるかに高速です。
ルックアップ値のチェーンがあるときはいつでも、 ChainMap
場合がChainMap
ます。例には、ユーザーが指定した値とデフォルト値のディクショナリの両方を持つことが含まれます。もう1つの例は、Webで使用されるPOST
およびGET
パラメータマップです(例:DjangoまたはFlask)。 ChainMap
使用すると、2つの異なる辞書の結合されたビューが返されます。
maps
パラメータリストは、最初に検索されたものから最後に検索されたものまで順番に並べられます。ルックアップは、キーが見つかるまで、基礎となるマッピングを逐次検索します。対照的に、書き込み、更新、および削除は、最初のマッピングでのみ機能します。
import collections
# define two dictionaries with at least some keys overlapping.
dict1 = {'apple': 1, 'banana': 2}
dict2 = {'coconut': 1, 'date': 1, 'apple': 3}
# create two ChainMaps with different ordering of those dicts.
combined_dict = collections.ChainMap(dict1, dict2)
reverse_ordered_dict = collections.ChainMap(dict2, dict1)
次のルックアップで値が最初に見つかる順序の影響に注目してください
for k, v in combined_dict.items():
print(k, v)
date 1
apple 1
banana 2
coconut 1
for k, v in reverse_ordered_dict.items():
print(k, v)
date 1
apple 3
banana 2
coconut 1