ホームページ  >  記事  >  バックエンド開発  >  Python 組み込みモジュール コレクションの紹介

Python 組み込みモジュール コレクションの紹介

angryTom
angryTom転載
2019-11-30 15:45:214728ブラウズ

Python 組み込みモジュール コレクションの紹介

Python の組み込みモジュール コレクションの紹介

Collections は、Python の組み込みコレクション モジュールであり、以下を提供します。便利な Collection クラスがたくさんあります。

1.namedtuple

Python には、バイナリ ベクトルを表すために簡単に使用できる不変型タプルなど、非常に便利な基本型が多数用意されています。

推奨学習: Python ビデオ チュートリアル

>>> v = (2,3)

(2,3) はベクトルの 2 つの座標を表しますが、追加の説明がなければ、このタプルが座標を表すために使用されていることを直接確認することは困難です。

このためにクラスを定義するのは大変なことですが、このとき、namedtuple が役に立ちます。

>>> from collections import namedtuple
>>> Vector = namedtuple('Vector', ['x', 'y'])
>>> v = Vector(2,3)
>>> v.x
2
>>> v.y
3

namedtuple は、カスタム タプル オブジェクトを作成し、タプル要素の数を指定する関数です。また、インデックスの代わりに属性を使用してタプルの要素を参照できます。

このように、namedtupleを使うとタプルの不変性を持ち、属性に基づいて参照できるデータ型を簡単に定義することができ、非常に便利です。

作成された Vector オブジェクトの型を確認できます。

>>> type(v)
<class &#39;__main__.Vector&#39;>
>>> isinstance(v, Vector)
True
>>> isinstance(v, tuple)
True

同様に、座標と半径を使用して円を表す場合は、namedtuple を使用して定義することもできます:

>>> Circle = namedtuple(&#39;Circle&#39;, [&#39;x&#39;, &#39;y&#39;, &#39;r&#39;])
# namedtuple(&#39;名称&#39;, [‘属性列表’])

2, deque

データ内 構造内では、キューとスタックの 2 つの非常に重要なデータ型であることがわかります。1 つは先入れ先出しで、もう 1 つは後入れ先出しです。 Python では、リストを使用してデータを保存する場合、インデックスによる要素へのアクセスは非常に高速ですが、要素の挿入と削除は非常に遅くなります。これは、リストが線形記憶域であるためであり、データ量が大きい場合、挿入と削除の効率が低下するためです。は非常に低いです。

Deque は、挿入および削除操作を効率的に実装するための二重リンク リスト構造であり、キューやスタックなどのデータ構造の実装に非常に適しています。

>>> from collections import deque
>>> deq = deque([1, 2, 3])
>>> deq.append(4)
>>> deq
deque([1, 2, 3, 4])
>>> deq.appendleft(5)
>>> deq
deque([5, 1, 2, 3, 4])
>>> deq.pop()
4
>>> deq.popleft()
5
>>> deq
deque([1, 2, 3])

リストの append() と Pop() の実装に加えて、deque は appendleft() と Popleft() もサポートしているため、head への要素の追加や削除を非常に効率的に行うことができます。

3.defaultdict

dict 辞書タイプを使用する場合、参照されたキーが存在しない場合、KeyError がスローされます。キーが存在しないときにデフォルト値を返したい場合は、defaultdict を使用できます。

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: &#39;defaultvalue&#39;)
>>> dd[&#39;key1&#39;] = &#39;a&#39;
>>> dd[&#39;key1&#39;]
&#39;a&#39;
>>> dd[&#39;key2&#39;] # key2未定义,返回默认值
&#39;defaultvalue&#39;

関数を呼び出すとデフォルト値が返され、defaultdict オブジェクトの作成時に関数が渡されることに注意してください。

キーが存在しない場合にデフォルト値を返すことを除いて、defaultdict の他の動作は dict とまったく同じです。

4. OrderedDict

dict を使用する場合、キーは順序付けされていません。 dict を反復処理する場合、キーの順序を決定できません。

ただし、キーの順序を維持したい場合は、OrderedDict を使用できます。

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

OrderedDict のキーは、キー自体ではなく、挿入の順序で配置されることに注意してください。

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

OrderedDict は、FIFO (先入れ先出し) 辞書を実装できます。容量が制限を超えている場合は、最初に追加されたキーを削除してください。

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(&#39;remove:&#39;, last)
        if containsKey:
            del self[key]
            print(&#39;set:&#39;, (key, value))
        else:
            print(&#39;add:&#39;, (key, value))
        OrderedDict.__setitem__(self, key, value)

5. ChainMap

ChainMap は、辞書のセットを連結して論理辞書を形成できます。 ChainMap自体も辞書ですが、検索の際は内部の辞書を順番に検索します。

ChainMap を使用するのが最も適切なのはどのような場合ですか?例: アプリケーションではパラメーターを渡す必要があることがよくありますが、パラメーターはコマンド ラインを通じて渡すことも、環境変数を通じて渡すこともでき、デフォルトのパラメーターを持つこともできます。 ChainMap を使用してパラメータの優先検索を実装できます。つまり、渡されない場合は最初にコマンド ライン パラメータを確認し、渡されない場合は環境変数を確認し、渡されない場合はデフォルトのパラメータを使用します。

次のコードは、user と color の 2 つのパラメータを検索する方法を示しています。

from collections import ChainMap
import os, argparse
# 构造缺省参数:
defaults = {
    &#39;color&#39;: &#39;red&#39;,
    &#39;user&#39;: &#39;guest&#39;
}
# 构造命令行参数:
parser = argparse.ArgumentParser()
parser.add_argument(&#39;-u&#39;, &#39;--user&#39;)
parser.add_argument(&#39;-c&#39;, &#39;--color&#39;)
namespace = parser.parse_args()
command_line_args = { k: v for k, v in vars(namespace).items() if v }
# 组合成ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)
# 打印参数:
print(&#39;color=%s&#39; % combined[&#39;color&#39;])
print(&#39;user=%s&#39; % combined[&#39;user&#39;])

パラメータがない場合は、デフォルトのパラメータを出力します:

$ python3 use_chainmap.py 
color=red
user=guest

コマンド ライン パラメータが渡されると、コマンド ライン パラメータが最初に使用されます:

$ python3 use_chainmap.py -u bob
color=red
user=bob

同時に、コマンド ラインはパラメーターと環境変数に渡されます。コマンド ライン パラメーターの方が優先されます:

$ user=admin color=green python3 use_chainmap.py -u bob
color=green
user=bob

6、Counter

Counter は単純なカウンターです。たとえば、文字の出現数を数えます。 Count:

from collections import Counter
>>> s = &#39;abbcccdddd&#39;
>>> Counter(s)
Counter({&#39;d&#39;: 4, &#39;c&#39;: 3, &#39;b&#39;: 2, &#39;a&#39;: 1})

Counter は、実際には dict のサブクラスです。

7. 概要

コレクション モジュールには、必要に応じて選択できるいくつかの便利なコレクション クラスが用意されています。


以上がPython 組み込みモジュール コレクションの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。