Pythonの研究ノート、特別な記録、あなたと共有してください、私はそれが皆に役立つことを願っています。
コレクションはPythonの組み込みコレクションモジュールであり、多くの便利なコレクションクラスを提供します。
名前付きtuple
タプルは不変集合を表すことができることがわかっています。たとえば、点の2次元座標は次のように表すことができます。
p = (1, 2)
ただし、(1、2)を見ると、このタプルが座標を表すために使用されていることがわかりません。
クラスの定義は大騒ぎになりました。現時点では、namedtupleが便利です。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print p.x
print p.y
演算結果:
1
2
Process finished with exit code 0
namedtupleは関数であり、カスタムタプルオブジェクトを作成するために使用され、タプル要素の数を指定し、インデックスの代わりに属性を使用してタプルの要素を参照できます。
このようにして、タプルの不変性を持ち、属性に従って参照できるnamedtupleを使用してデータ型を簡単に定義できるため、非常に便利です。
作成されたPointオブジェクトがタプルのサブクラスであることを確認できます。
print isinstance(p, Point)
print isinstance(p, tuple)
演算結果:
True
True
Process finished with exit code 0
同様に、座標と半径を使用して円を表す場合は、namedtuple定義を使用することもできます。
# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])
そして
リストを使用してデータを格納する場合、インデックスによる要素へのアクセスは高速ですが、リストは線形に格納されるため、要素の挿入と削除は非常に遅く、データ量が多い場合、挿入と削除の効率は非常に低くなります。
dequeは、効率的な挿入および削除操作のための双方向リストであり、キューおよびスタックに適しています。
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print q
演算結果:
deque(['y', 'a', 'b', 'c', 'x'])
Process finished with exit code 0
リストのappend()とpop()の実装に加えて、dequeはappendleft()とpopleft()もサポートしているため、要素をヘッドに非常に効率的に追加または削除できます。
defaultdict
dictを使用する場合、参照されているキーが存在しないと、KeyErrorがスローされます。キーが存在しないときにデフォルト値を返したい場合は、defaultdictを使用できます。
from collections import defaultdict
dd = defaultdict(lambda : 'N/A')
dd['key1'] = 'abc'
# key1存在
print dd['key1']
# key2不存在,返回默认值
print dd['key2']
演算結果:
abc
N/A
Process finished with exit code 0
デフォルト値は呼び出し元の関数によって返され、defaultdictオブジェクトが作成されるときに関数が渡されることに注意してください。
キーが存在しない場合にデフォルト値を返すことを除いて、defaultdictの他の動作はdictとまったく同じです。
OrderedDict
dictを使用している場合、キーが故障しています。dictを反復処理する場合、キーの順序を判別できません。
キーの順序を維持したい場合は、OrderedDictを使用できます。
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
# dict的Key是无序的
print d
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
# OrderedDict的Key是有序的
print od
演算結果:
{'a': 1, 'c': 3, 'b': 2}
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
Process finished with exit code 0
OrderedDictのキーは、キー自体ではなく、挿入順に配置されることに注意してください。
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
# 按照插入的Key的顺序返回
print list(od.keys())
演算結果:
['z', 'y', 'x']
Process finished with exit code 0
OrderedDictは、FIFO(first-in-first-out)dictを実装できます。容量が制限を超えると、最初に追加されたキーが最初に削除されます。
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)
チェーンマップ
ChainMapは、dictのグループをつなぎ合わせて、論理的なdictを形成できます。ChainMap自体もdictですが、検索するときは、内部dictを順番に検索します。
ChainMapを使用するのに最も適切な時期はいつですか?例:アプリケーションは多くの場合、パラメーターを渡す必要があります。パラメーターはコマンドラインから渡すことができ、環境変数から渡すことができます。また、デフォルトのパラメーターもあります。ChainMapを使用して、パラメーターの優先検索を実現できます。つまり、最初にコマンドラインパラメーターをチェックし(渡されない場合)、次に環境変数をチェックします(渡されない場合)。デフォルトのパラメーターを使用します。
次のコードは、userとcolorの2つのパラメーターを見つける方法を示しています。
from collections import ChainMap
import os, argparse
# 构造缺省参数:
defaults = {
'color': 'red',
'user': 'guest'
}
# 构造命令行参数:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
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 'color=%s' % combined['color']
print 'user=%s' % combined['user']
パラメータがない場合、デフォルトのパラメータが出力されます。
$ 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
カウンター
Counterは単純なカウンターであり、たとえば、表示される文字数をカウントします。
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
print c
演算結果:
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
Process finished with exit code 0
Counterは、実際にはdictのサブタイプです。上記の結果から、文字「g」、「m」、および「r」がそれぞれ2回出現し、他の文字がそれぞれ1回出現することがわかります。
公式アカウント**「NetDevelopment」**をフォローすることを歓迎します。Pythonのテストデモと学習リソースを受け取り、全員が一緒にPythonを学習できるようにし、開発を促進するための世界のメソッドを収集できます。
パブリックアカウント「WebDevelopment」へようこそ