python collectionsモジュール--組み込みデータ型


基本的な紹介
Pythonに内蔵されているデータ型に加えて、str、int、list、tuple、dictなど、collectionsモジュールはこれらの内蔵データ型に基づいて、いくつかの追加のデータ型を提供しています.
関数名
説明
namedtuple
名前を使用して要素コンテンツにアクセスできるtupleサブクラスを生成
deque
両端のキューで、オブジェクトをすばやく反対側から追加、押し出すことができます
defaultdict
デフォルトの辞書
OrderedDict
ちくじじしょ
Counter
カウンタ、主にカウントに使用
ChainMap
複数のmapを組み合わせる
namedtuple
namedtupleは主に、要素に名前でアクセスできるデータオブジェクトを生成するために使用され、通常はコードの可読性を向上させるために使用され、いくつかのtupleタイプのデータにアクセスする際に特に便利です.
例:
import collections

Point = collections.namedtuple("Point", ("x", "y"))
p = Point(1, 2)
print(p, p.x, p.y)

出力:
Point(x=1, y=2) 1 2

deque
リストを使用してデータを格納する場合、インデックスによる要素へのアクセスは速いが、リストが線形格納であるため、リストが大きい場合、挿入と削除の効率は低い.dequeは、挿入および削除操作を効率的に実現するための双方向リストであり、リストの方法に加えて、キューおよびスタックに適しています.
関数名
説明
appendleft
キューの左に要素を追加
extendleft
キューの左側の拡張子は、リスト、メタグループ、または辞書であり、辞書の場合はdequeに辞書のkeyを追加します.
popleft
キューの左にある要素を削除して戻します
rotate(n)
キュー数の移動
例:
import collections

d = collections.deque([1, 2, 3, 4])
d.append(5)
d.appendleft(0)
print(d)
d.rotate(5) #     5print(d)

出力:
deque([0, 1, 2, 3, 4, 5])
deque([1, 2, 3, 4, 5, 0])

deque
デフォルト辞書、辞書のサブクラスで、すべての辞書のメソッドを継承しますが、Keyが存在しない場合はデフォルト値が返されます.defaultdictを使用すると、デフォルトのファクトリメソッドを入力すると、存在しないkeyを要求すると、このファクトリメソッドがその結果を呼び出してこのkeyのデフォルト値として使用されます.
例:
import collections

s = [("yellow", 1), ("red", 2), ("yellow", 3), ("blue", 4), ("red", 1)]
dd = collections.defaultdict(list)
for k, v in s:
    dd[k].append(v)
print(dd["black"])
print(dd)

dd2 = collections.defaultdict(lambda: None)
dd2["key1"] = 1
print(dd2["key2"])
print(dd2)


出力:
[]
defaultdict(<class 'list'>, {
     'yellow': [1, 3], 'red': [2, 1], 'blue': [4], 'black': []})
None
defaultdict(<function <lambda> at 0x11779e378>, {
     'key1': 1, 'key2': None})

現在、辞書には対応するキー値がないが、辞書のupdateメソッドを実行することができる.この操作は、従来の辞書タイプでは実現できません.更新に値する操作を行うには、値を付けなければなりません.そうしないと、エラーが発生します.
OrderedDict
秩序化された辞書は、辞書のサブクラスでもあります.Pythonではdictというデータ構造はhashの特性により無秩序である.collectionsモジュールは、OrderedDictを提供し、秩序ある辞書オブジェクトを取得します.
例:
import collections

od = collections.OrderedDict()
od["z"] = 3
od["y"] = 1
od["x"] = 2
print(list(od.keys()))

出力:
['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)

Counter
カウンタは、辞書のサブクラスでもあり、hashtableカウントを行い、要素を数量統計し、カウントした後に辞書を返します.キー値は要素で、値は要素の個数です.一般的な方法:
関数名
説明
most_common(int)
要素の出現回数に応じて高い順から低い順に並べ替え、前のint要素の辞書を返す
elements
計算機Counterを通過した要素を返し、反復器を返します.
update
setコレクションのupdateと同様に、コレクションをパラレル更新する
substract
updateと似ていますが、updateは加算を行い、substractは減算を行い、別の集合から本集合の要素を減算します.
例:
import collections

str = "abbccabbbcca"
lst = ["a", "b", "c", "a", "b", "b"]
dic = {
     "a": 3, "b": 17, "c": 4}

#        ,    
print(collections.Counter(str))
print(collections.Counter(lst))
print(collections.Counter(dic))

# most_common(int),      n 
d1 = collections.Counter(str)
print(d1.most_common(2))

# elements       Counter    ,         
print(sorted(d1.elements()))
print("".join(d1.elements()))

出力:
Counter({
     'b': 5, 'c': 4, 'a': 3})
Counter({
     'b': 3, 'a': 2, 'c': 1})
Counter({
     'b': 17, 'c': 4, 'a': 3})
[('b', 5), ('c', 4)]
['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c']
aaabbbbbcccc

ChainMap
ChainMapは、dictのセットを直列に接続し、論理的なdictを構成することができる.ChainMap自体もdictですが、検索すると、内部のdictの順に検索されます.
例:
#      
dict1 = {
     'a': 1, 'b': 2}
dict2 = {
     'b': 3, 'c': 4}

#    ChainMap
chain = collections.ChainMap(dict1, dict2)

#   maps  chainMap
print(chain.maps)

#   key
print(list(chain.keys()))
#    
print(list(chain.values()))

#   new_child     
dict3 = {
     'f': 5}
new_chain = chain.new_child(dict3)
print(new_chain.maps)

出力:
[{
     'a': 1, 'b': 2}, {
     'b': 3, 'c': 4}]
['b', 'c', 'a']
[2, 4, 1]
[{
     'f': 5}, {
     'a': 1, 'b': 2}, {
     'b': 3, 'c': 4}]

参照先:https://www.cnblogs.com/zhizhan/p/5692668.html