サーチ…


前書き

ビルトインcollectionsパッケージには、高性能であり、 dictlisttuple 、およびsetの一般的なコレクションタイプに代わるものを提供する、いくつかの特殊で柔軟なコレクションタイプが用意setます。また、このモジュールは、さまざまなタイプのコレクション機能( MutableSetItemsView )を記述する抽象基本クラスも定義します。

備考

コレクションモジュールには、次の3つのタイプがあります。

  1. UserDict
  2. ユーザーリスト
  3. UserString

それらはそれぞれ、結ばれたオブジェクトの周りのラッパーとして機能します。たとえば、 UserDictdictオブジェクトの周りのラッパーとして機能します。いずれの場合も、クラスはその名前付き型をシミュレートします。インスタンスの内容は、ラッパー・インスタンスのデータ属性を介してアクセス可能な通常型オブジェクトに保持されます。これらの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の典型的な使い方は、引数なしで呼び出されたときに空の型を返すため、 strintlistまたは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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow