【Pythonのコレクション】 - 2019年8月9日11時03分44秒

オリジナル:http://106.13.73.98/__/74/

上の組み込みデータ型(辞書、リスト、セット、タプル)に基づき、コレクションモジュールは、データのいくつかの追加の種類を提供しています。

  • namedtuple:データのタプル型の一部にアクセスするときの生成には、多くの場合、コードの可読性を向上させるために使用、要素のタプルのコンテンツにアクセスするために特に便利名前を使用することができます。
  • deque:両端キューが、すぐに他の側面および追加のオブジェクトから導入することができます。
  • Counter:メインをカウントするカウンタ。
  • OrderedDict:辞書を命じました。
  • defaultdict:デフォルト値を持つ辞書。

@
***

namedtuple

まず、タプルは、例えば、点の2次元座標は次のように表すことができ、同じコレクションを表すことができる知っています。

>>> p = (1, 2)

しかし、(1,2)、座標表現するために使用され、このタプルを区別することは困難である参照。
この場合、重宝namedtuple。

>>> from collections import namedtuple
>>> Ponint = namedtuple('Ponint', ['x', 'y'])
>>> p = Ponint(1, 2)
>>> p.x
1
>>> p.y
2

別の例として、このようなデータ構造:各オブジェクトがタプルである三つの要素を有している。
簡単にタプルによって、より高いおよびより良好可読のデータ構造を生成することができる方法をnamedtuple使用。

from collections import namedtuple

userinfo = [
    ("花千骨", "洪荒之力", "白子画"),
    ("白浅", "玉清昆仑扇", "夜华"),
    ("锦觅", "翊圣玄冰", "旭凤")
]

Userinfo = namedtuple('Userinfo', ["姓名", "必杀技", "男朋友"])
[print(Userinfo._make(ui)) for ui in userinfo]

"""打印结果如下:
Userinfo(姓名='花千骨', 必杀技='洪荒之力', 男朋友='白子画')
Userinfo(姓名='白浅', 必杀技='玉清昆仑扇', 男朋友='夜华')
Userinfo(姓名='锦觅', 必杀技='翊圣玄冰', 男朋友='旭凤')
"""

いわゆるシングルエンドキューが、それは、一方の端部に、別のが引き出されています。
いわゆる両端キューは、つまり、双方がアクセスすることができます。

両端キューは、翻訳があり、実際に両端キューの略です双端队列
最大の利点は、急速な増加の両端キューを達成することであると、キューの先頭からオブジェクトを削除しました:.popleft().appendleft()

あなたはネイティブのリストには、ああ頭からオブジェクトを追加したり削除することができ、言うかもしれませんか?このように:

lst.insert(0, 'a')
lst.pop(0)

しかし、我々は注意を払う必要があり、オブジェクトリストのこれらの2つの用途の時間計算量はO(n)は、それが要素数の増加と言うことです、時間のかかるが直線的に上昇する。
使用デックオブジェクト(1)Oでありますあなたは、このようなニーズを持っている場合、コードの複雑さはそう、我々は両端キューを使用するために覚えておく必要があります。

両端キューと効率性のリスト

  • データの場合、大量データ記憶のリストを使用して、すばやくインデックスで要素にアクセスするが、リストは線形メモリであるので、要素を挿入および除去する、非常に遅い場合、挿入及び効率が非常に低くなる削除。
  • インサートを使用する場合、メソッドを削除し、平均効率は、両端キューリストよりもはるかに高いです。
  • インデックス検索効率の値に基づいてリストが両端キューよりも高くなっています。
  • 追加し、popメソッドは、効率性のリストには影響しません。

例は、両端キューを終了します

>>> from collections import deque
>>> dq = deque([1, 2, 3])
>>> dq.append('z')
>>> dq.appendleft('a')  # 从头部添加元素
>>> dq.pop()
'z'
>>> dq.popleft()  # 从头部弹出元素
'a'

両端キューとして、両端キューのような他の有用な方法を提供するrotate
以下は、回転方法の興味深い例は、主に無限ループ両端キュー負荷アニメーションを実現するために使用されます。

from collections import deque
import sys
import time

running = deque('>---------------------')
while 1:
    print('\r', ''.join(running), end='')
    running.rotate(1)
    sys.stdout.flush()
    time.sleep(0.2)

# 一个无限循环的跑马灯
# ------------>--------

カウンタ

カウンタオブジェクトクラスは、値が発生した回数を追跡するために使用される。
カウンタは、辞書メモリのキーを形成するために順序付けられていないタイプの容器であり、鍵のような要素は、カウント値として、カウント値が0を含む任意のInterger(であっても良いですそして、。)負の
非常によく似たカウンターベースの言語およびその他のバッグや多重集合。

カウンターの例では、文の統計モジュールを使用するすべての文字が出現

from collections import Counter

s = '''
    A Counter is a dict subclass for counting hashable objects. 
    It is an unordered collection where elements are stored as dictionary keys and 
    their counts are stored as dictionary values. 
    Counts are allowed to be any integer value including zero or negative counts. 
    The Counter class is similar to bags or multisets in other languages.
'''.lower()

c = Counter(s)
# 获取出现频率最高的4个字符
print(c.most_common(4))  # [(' ', 74), ('e', 32), ('s', 25), ('a', 24)]

OrderedDict

Pythonでは、ハッシュの特性により、このデータ構造をのdict、時には私たちにいくつかのトラブルを与えており、無秩序である。
幸い、コレクションモジュールは、私たちのためにOrderedDictを提供し、あなたは秩序を取得したいときときに、辞書オブジェクト、右のそれを使用しています。

辞書のPython3.6以降のバージョンを注文されます。

簡単な例

>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])


しかし、それに注意し、OrderedDictキーが挿入順に配置され、代わりにキー自体をソートします:

>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']

defaultdict

一例としては、
-
このようなコレクションがあります:[1, 2, 3, 4, 5, 7, 8, 9]
以下の辞書への最初のキー、第二キーを保存するには5より大きい値の5よりもすべての値を保存します。

のは、辞書を達成する方法を見てみましょう。

lst = [1, 2, 3, 4, 5, 7, 8, 9]
dct = {}
for i in lst:
   key = 'k1' if i < 5 else 'k2'
    dct.setdefault(key, []).append(i)

defaultdictを達成する方法を見てみましょう:

from collections import defaultdict

lst = [1, 2, 3, 4, 5, 7, 8, 9]
dd = defaultdict(list)

for i in lst:
    key = 'k1' if i < 5 else 'k2'
    dd[key].append(i)

# defaultdict(<class 'list'>, {'k1': [1, 2, 3, 4], 'k2': [5, 7, 8, 9]})

また、辞書のネイティブPythonのデータ構造を、使用している場合ならばd[key]、指定されたキーが存在しない場合に、このようなアクセス、それはKeyError例外例外がスローされます。

あなたがdefaultdictを使用する場合は、限り、あなたは、デフォルトのファクトリメソッド、存在しない、要求キーを渡すように、このキーのデフォルト値の結果として使用するファクトリメソッドを呼び出します。

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['name'] = "花千骨"
>>> dd['name']
'花千骨'
>>> dd['sex']   #'sex'不存在,将返回默认值
'N/A'

上記は、メインのコンテンツコレクションモジュールについてだけで非常に簡単な紹介です、主な目的は、あなたがそれらを使用し、覚えることができるそれらを使用するのに適した場所に実行すると、乗数効果を果たしていることです。

あなたがそれらをより包括的かつ深い理解を持つようにしたい場合は、私は公式ドキュメントやソースコードモジュールを読み込む示唆、移動します

オリジナル:http://106.13.73.98/__/74/

おすすめ

転載: www.cnblogs.com/gqy02/p/11325903.html