Pythonの中のコンテナコレクションを詳しく説明します。


前に書く
Pythonには多くの標準的なデータ構造が内蔵されていることを知っています。リスト、タプル、辞書などです。同時に標準ライブラリはまた、それらに基づいて必要な新しいデータ構造を作成することができるいくつかの追加的なデータ構造を提供しています。
Pythonには多くのコンテナデータの種類が含まれている「容器」モジュールが付属しています。今日はその中のいくつかのよく使われているコンテナデータの種類を検討してみます。これらを把握したら、私たちが繰り返し輪を作ってもたらす迷惑を減らすことができます。
namedtuple
あなたは元のグループに慣れていると信じています。タプルは可変ではないリストに相当します。データのシーケンスを格納することができます。ここで言うnamedtupleとタプルはとても似ています。自分のデータを修正することはできません。像を言いましたが、似てないところがありますか?
タプルとしては、データを得るためには、インデックスとして整数を使用する必要があります。

>>> people = ('Rocky', 'python')
>>> print(people[0])
Rocky
namedtupleはタプルを簡単なタスクに対する容器に変えました。我々は整数インデックスを使ってnamedtupleのデータにアクセスする必要はなく、むしろ辞書のようにnamedtupleにアクセスすることができます。

>>> from collections import namedtuple
>>> people = namedtuple('people', 'name age like')
>>> Rocky = people(name = 'rocky', age = 23, like = 'python')
>>> print(Rocky)
people(name='rocky', age=23, like='python')
>>> print(Rocky.name)
rocky
一つのnamedtupleには二つの必須パラメータがあります。タプル名とフィールド名です。上のコードの中で、私達の元のグループ名はpeopleで、フィールド名はname、age、likeです。nametupleは元のグループをより読みやすくし、コードが何をするかを分かりやすくします。同様に、私たちも整数インデックスを使って名前付きのタプルにアクセスしなくてもいいです。
しかし、覚えておきたいのは、さわやかな使い方ですが、元のグループです。したがって、属性値はnamedtupleでは可変されません。
上記では辞書のようにnamedtupleにアクセスできると言っていましたが、もちろん辞書にも変えられます。具体的な操作は下記の通りです。

>>> from collections import namedtuple
>>> people = namedtuple('people', 'name age like')
>>> Rocky = people(name = 'rocky', age = 23, like = 'python')
>>> print(Rocky._asdict())
OrderedDict([('name', 'rocky'), ('age', 23), ('like', 'python')])
defaultdict
私は以前辞書を使っていましたが、適当にdictしてもいいです。しかし、このように使っています。keyが存在しない時はKeyErrに報告します。defaultdictはすごいです。keyが存在するかどうかを確認する必要はありません。だから私達は次のようにやりたい放題です。

from collections import defaultdict

languages = (
  ('rocky', 'python'),
  ('snow', 'c'),
  ('leey', 'java'),
  ('rocky', 'c++'),
  ('leey', 'c#')
)

favourite = defaultdict(list)

for name, language in languages:
  favourite[name].append(language)

print(favourite)
出力は以下の通りです。
defaultdict(その後、キーが存在しないと、KeyErr異常が発生するという問題に戻ります。まず、dictトリガKeyErrorの例を見てみます。

my_dict = {}
my_dict['name']['like'] = 'python'
出力は以下の通りです
KeyError:'name'
defaultdictは非常に巧みな方法でこの問題を避けました。次の操作を見てください。

import collections
language = lambda : collections.defaultdict(language)
my_dict = language()
my_dict['name']['like'] = 'python'
運行して正常なことを表示すって、私達はjson.dumpsでmy_をプリントアウトすることができます。プロジェクトの内容:

import json
print(json.dumps(my_dict))
運転結果は以下の通りです。
{「name」:{「like」:「python」}
カウンター
Counterはカウンタです。それは私たちが得意なプログラミング言語を統計するために、あるデータをカウントしてくれます。

from collections import Counter

languages = (
('rocky', 'python'),
('snow', 'c'),
('leey', 'java'),
('rocky', 'c++'),
('leey', 'c#')
)

cnt = Counter(name for name, language in languages)
print(cnt)
運転結果は以下の通りです。
Counter(''leey':2,'rocky':2,'snow':1))
もちろん私達もそれを使ってファイルを統計することができます。例えば:
from collection s import Counter
with open('test.txt'、'rb')as f:
linecnt=Counter(f)
printcnt
deque
dequeは二重端列を提供しています。最初の端の両端に要素を追加または削除できます。
dequeを使用するには、まずcollectionからdequeモジュールを導入し、dequeオブジェクトを作成します。その使い方は前に習ったlistのように、そして同様の方法を提供します。具体的には以下の通りです。

from collections import deque

deq = deque()
deq.append(1)
deq.append(2)
deq.append(3)
print(deq)
print(len(deq))
print(deq[0])
print(deq[-1])
出力結果は以下の通りです。
deque([1,2,3])
3
1
3
両端からデータを取り出すことができます。

from collections import deque

deq = deque(range(5))
print('len(deq) == {}'.format(len(deq)))
deq.popleft()
deq.pop()
print(deq)
出力の結果は以下の通りです。
len(deq)==5
deq==deque([1,2,3])
私たちはこのリストのサイズを制限してもいいです。私たちの制限を超えると、データは他端からpopされます。具体的には下記の操作を見にきます。

from collections import deque

deq = deque(maxlen=3)
deq.append(1)
deq.append(2)
deq.append(3)
print(deq)
deq.append(4)
print (deq)
出力の結果は以下の通りです。
deque([1,2,3],maxlen=3)
deque([2,3,4],maxlen=3)
maxlenの値を超えると、一番左のデータがキューから削除されます。
もちろん、任意の端からこの二重端列のデータを拡張することもできる。

from collections import deque

deq = deque([1,2,3])
deq.extendleft([0])
deq.extend([4,5,6])
print(deq)
出力の結果は以下の通りです。
deque([0,1,2,3,4,5,6])
以上はPythonの中の容器のcollectionの詳しい内容を詳しく説明しました。python collectionに関する資料は他の関連記事に注目してください。