Python |コレクションはとても使いやすいです! !

出典:サウスブランチからウォームノースブランチ、コールドMA

https://blog.csdn.net/mall_lucy/article/details/108822795

[はじめに]:コレクションは、Pythonの標準の組み込みコンテナーであるdict、list、set、およびtupleの代替を提供するという特定の目標を達成するコンテナーです。みんなにもっと理解してもらうために、この記事ではコレクションの関連知識を詳しくまとめています。一緒に学びましょう!

コレクションモジュール:Python標準の組み込みコンテナdict、list、set、およびtupleの代替を提供するという特定の目標を達成するコンテナ。

カウンター:ハッシュ可能なオブジェクトのカウント機能を提供する辞書のサブクラス。

defaultdict:辞書クエリのデフォルト値を提供するファクトリ関数を提供する辞書のサブクラス。

OrderedDict:追加された順序を保持する辞書のサブクラス。

namedtuple:名前付きタプルサブクラスを作成するためのファクトリ関数。

deque:両端にクイック追加とポップを実装するリストコンテナに似ています。

ChainMap:複数のマップを1つのビューに収集する辞書のようなコンテナクラス。

Counter

Counterはdictのサブクラスであり、主にアクセスするオブジェクトの頻度をカウントするために使用されます。

>>> import collections
>>> # 文字の出現回数を数える
... collections.Counter('hello world')Counter({'l':3,'o':2,'h':1,'e':1,' ':1,'w':1,'r':1,'d':1})>>> #単語数を数える
... collections.Counter('hello world hello lucy'.split())Counter({'hello':2,'world':1,'lucy':1})

一般的な方法:

>>> c = collections.Counter('hello world hello lucy'.split())>>> c
Counter({'hello':2,'world':1,'lucy':1})>>> #指定されたオブジェクトへの訪問数を取得します。getメソッドを使用することもできます
... c['hello']2>>> #要素を表示
... list(c.elements())['hello','hello','world','lucy']>>> c1 = collections.Counter('hello world'.split())>>> c2 = collections.Counter('hello lucy'.split())>>> c1
Counter({'hello':1,'world':1})>>> c2
Counter({'hello':1,'lucy':1})>>> #オブジェクトを追加し、+またはc1.update(c2)... c1+c2
Counter({'hello':2,'world':1,'lucy':1})>>> #オブジェクトを減らし、-またはc1.subtract(c2)... c1-c2
Counter({'world':1})>>> #晴れ
... c.clear()>>> c
Counter()

defaultdict

新しい辞書のようなオブジェクトを返します。 defaultdictは、組み込みのdictクラスのサブクラスです。

class collections.defaultdict([default_factory[, ...]])

>>> d = collections.defaultdict()>>> d
defaultdict(None,{})>>> e = collections.defaultdict(str)>>> e
defaultdict(<class'str'>,{})

defaultdictの一般的な使用法は、組み込み型の1つ(str、int、list、dictなど)をデフォルトのファクトリとして使用することです。これらの組み込み型は、パラメーターなしで呼び出されると空の型を返します。

>>> e = collections.defaultdict(str)>>> e
defaultdict(<class'str'>,{})>>> e['hello']''>>> e
defaultdict(<class'str'>,{'hello':''})>>> #通常の辞書が存在しないキーを呼び出すと、エラーが報告されます
... e1 ={}>>> e1['hello']Traceback(most recent call last):
 File "<stdin>", line 1,in<module>
KeyError:'hello'

default_factoryとしてintを使用します

>>> fruit = collections.defaultdict(int)>>> fruit['apple']=2>>> fruit
defaultdict(<class'int'>,{'apple':2})>>> fruit['banana']  #オブジェクトがない場合は00を返します>>> fruit
defaultdict(<class'int'>,{'apple':2,'banana':0})

default_factoryとしてリストを使用する

>>> s =[('yellow',1),('blue',2),('yellow',3),('blue',4),('red',1)]>>> d = collections.defaultdict(list)>>>for k,v in s:...     d[k].append(v)...>>> d
defaultdict(<class'list'>,{'yellow':[1,3],'blue':[2,4],'red':[1]})>>> d.items()dict_items([('yellow',[1,3]),('blue',[2,4]),('red',[1])])>>>sorted(d.items())[('blue',[2,4]),('red',[1]),('yellow',[1,3])]

default_factoryとしてdictを使用する

>>> nums = collections.defaultdict(dict)>>> nums[1]={'one':1}>>> nums
defaultdict(<class'dict'>,{1:{'one':1}})>>> nums[2]{}>>> nums
defaultdict(<class'dict'>,{1:{'one':1},2:{}})

setをdefault_factoryとして使用します

>>> types = collections.defaultdict(set)>>> types['携帯電話'].add('Huawei')>>> types['携帯電話'].add('Xiaomi')>>> types['モニター'].add('AOC')>>> types
defaultdict(<class'set'>,{'携帯電話':{'Huawei','Xiaomi'},'モニター':{'AOC'}})

OrderedDict

Python辞書のキーの順序は任意であり、追加される順序によって制御されません。

collections.OrderedDictクラスは、追加された順序を保持する辞書オブジェクトを提供します。

>>> o = collections.OrderedDict()>>> o['k1']='v1'>>> o['k3']='v3'>>> o['k2']='v2'>>> o
OrderedDict([('k1','v1'),('k3','v3'),('k2','v2')])

既存のキーに新しい値を追加すると、元のキーの位置が保持され、値の値が上書きされます。

>>> o['k1']=666>>> o
OrderedDict([('k1',666),('k3','v3'),('k2','v2')])>>>dict(o){'k1':666,'k3':'v3','k2':'v2'}

namedtuple

名前付きタプルを定義する3つの方法:最初のパラメーターは、名前付きタプルのコンストラクターです(次のように:Person1、Person2、Person3)

>>> P1 = collections.namedtuple('Person1',['name','age','height'])>>> P2 = collections.namedtuple('Person2','name,age,height')>>> P3 = collections.namedtuple('Person3','name age height')

名前付きタプルをインスタンス化します

>>> lucy =P1('lucy',23,180)>>> lucy
Person1(name='lucy', age=23, height=180)>>> jack =P2('jack',20,190)>>> jack
Person2(name='jack', age=20, height=190)>>> lucy.name  #インスタンス名を直接渡す.呼び出す属性
' lucy'>>> lucy.age
23

deque

collections.dequeは、(append()メソッドを使用して)左から右に初期化され、反復可能なデータから作成された、新しい双方向キューオブジェクトを返します。 iterableが指定されていない場合、新しいキューは空です。

collections.dequeキューはスレッドの安全性をサポートし、両端からの追加またはポップの複雑さはO(1)です。

リストオブジェクトも同様の操作をサポートしていますが、固定長操作(pop(0)、insert(0、v))のオーバーヘッドはここで最適化されています。

maxlenが指定されていないか、Noneの場合、dequeは任意の長さに拡張できます。それ以外の場合、dequeは指定された最大長に制限されます。限られた長さのdequeがいっぱいになると、新しいアイテムが追加されると、同じ数のアイテムがもう一方の端から排出されます。

サポートされている方法:

>>> d = collections.deque(maxlen=10)>>> d
deque([], maxlen=10)>>> d.extend('python')>>>[i.upper()for i in d]['P','Y','T','H','O','N']>>> d.append('e')>>> d.appendleft('f')>>> d.appendleft('g')>>> d.appendleft('h')>>> d
deque(['h','g','f','p','y','t','h','o','n','e'], maxlen=10)>>> d.appendleft('i')>>> d
deque(['i','h','g','f','p','y','t','h','o','n'], maxlen=10)>>> d.append('m')>>> d
deque(['h','g','f','p','y','t','h','o','n','m'], maxlen=10)

ChainMap

問題の背景は、複数の辞書またはマッピングがあり、それらを1つのマッピングにマージしたいということです。更新を使用してマージできると言う人もいます。これに伴う問題は、元の辞書を変更すると、新しいデータ構造が作成されることです。時間は同期されません。同期クエリメソッドを確立する場合は、ChainMapを使用できます。

2つ以上の辞書をマージするために使用でき、クエリを実行するときは、前から後ろにクエリを実行します。使い方は簡単:

>>> d1 ={'apple':1,'banana':2}>>> d2 ={'orange':2,'apple':3,'pike':1}>>> combined1 = collections.ChainMap(d1,d2)>>> combined2 = collections.ChainMap(d2,d1)>>> combined1
ChainMap({'apple':1,'banana':2},{'orange':2,'apple':3,'pike':1})>>> combined2
ChainMap({'orange':2,'apple':3,'pike':1},{'apple':1,'banana':2})>>>for k,v in combined1.items():...print(k,v)...
orange 2
apple 1
pike 1
banana 2>>>for k,v in combined2.items():...print(k,v)...
apple 3
banana 2
orange 2
pike 1

注意点の1つは、ChainMapを変更する場合、常に最初の辞書のみが変更されることです。最初の辞書にキーが存在しない場合は、追加されます。

>>> d1 ={'apple':1,'banana':2}>>> d2 ={'orange':2,'apple':3,'pike':1}>>> c = collections.ChainMap(d1,d2)>>> c
ChainMap({'apple':1,'banana':2},{'orange':2,'apple':3,'pike':1})>>> c['apple']1>>> c['apple']=2>>> c
ChainMap({'apple':2,'banana':2},{'orange':2,'apple':3,'pike':1})>>> c['pike']1>>> c['pike']=3>>> c
ChainMap({'apple':2,'banana':2,'pike':3},{'orange':2,'apple':3,'pike':1})

上記の原則から、ChainMapは実際に配置された辞書をキューに格納します。辞書が追加および削除されると、最初の辞書でのみ実行されます。検索が実行されると、順番にnew_child()が検索されます。このメソッドは基本的に、リストの最初の要素の前に辞書を配置します。デフォルトは{}で、親はリストの最初の要素が削除されます。

>>> a = collections.ChainMap()>>> a['x']=1>>> a
ChainMap({'x':1})>>> b = a.new_child()>>> b
ChainMap({},{'x':1})>>> b['x']=2>>> b
ChainMap({'x':2},{'x':1})>>> b['y']=3>>> b
ChainMap({'x':2,'y':3},{'x':1})>>> a
ChainMap({'x':1})>>> c = a.new_child()>>> c
ChainMap({},{'x':1})>>> c['x']=1>>> c['y']=1>>> c
ChainMap({'x':1,'y':1},{'x':1})>>> d = c.parents
>>> d
ChainMap({'x':1})>>> d is a
False
>>> d == a
True
>>> a ={'x':1,'z':3}>>> b ={'y':2,'z':4}>>> c = collections.ChainMap(a,b)>>> c
ChainMap({'x':1,'z':3},{'y':2,'z':4})>>> c.maps
[{' x':1,'z':3},{'y':2,'z':4}]>>> c.parents
ChainMap({'y':2,'z':4})>>> c.parents.maps
[{' y':2,'z':4}]>>> c.parents.parents
ChainMap({})>>> c.parents.parents.parents
ChainMap({})
Love&Share [終了]

Recommended Posts

Python |コレクションはとても使いやすいです! !
パイソンタプルの使い方
pythonスレッドプールの使用方法
pythonを使用して段階的な回帰を実現します
pythonクローラーは簡単に習得できますか
PythonでSQLiteを使用する方法
Pythonを使用して飛行機の戦争ゲームを作成する
PYTHONを使用してニュース記事をクロールする方法
Pythonを使用してDouyinキャラクタービデオを生成してください!
Python初心者はライブラリの使い方を学びます
Pythonを使用して画像をすばやく切り取る
python3を使用してubuntuに3番目をインストールします
習得しやすいPythonまたはJavaScript
pythonでround関数を使用する方法
Pythonでzip関数を使用する方法
pythonまたはphpを学ぶのは簡単です
01.Pythonの概要
pythonでformat関数を使用する方法
pythonでアシスタントを実行するコードを使用する方法
Pythonクローラー-美しいスープの使用
pythonを使用して名刺管理システムを実現する
Pythonの紹介
パイソンを使って航空機戦争ゲームを実現する
pythonがmysqlに接続するための方法は何ですか
pythonでファイルを開く方法は何ですか
Centos 6.4 python2.6を2.7にアップグレード
Centos 6.4 python2.6を2.7にアップグレード
Python3外部モジュールの使用