ホームページ  >  記事  >  バックエンド開発  >  Python の組み込みモジュールである Collections について話しましょう

Python の組み込みモジュールである Collections について話しましょう

王林
王林転載
2023-04-12 12:46:081148ブラウズ

Python の組み込みモジュールである Collections について話しましょう

1. モジュールの説明

collections は Python の組み込みモジュールです。いわゆる組み込みモジュールとは、Python 内にパッケージ化されているモジュールを指します。インストールせずに直接使用できます。

  • collections には、Python の組み込みコンテナ (list、dict、set、tuple など) の代替となる特別なコンテナがいくつか含まれています。
  • namedtuple: 名前を含むタプルを作成できます。
  • deque: リストに似たコンテナで、キューの先頭と末尾の要素をすばやく追加および削除できます。
  • OrderedDict: 要素が追加される順序を記憶できる dict のサブクラス。
  • defaultdict: デフォルト値を提供する関数を呼び出すことができる dict のサブクラス。
  • Counter: ハッシュ可能なオブジェクトを計算する dict のサブクラス。

2. 実際のコード

(1) testNamedTuple 関数

Python は、不変型タプルなど、非常に使いやすい基本型を多数提供しています。これを使用してバイナリ ベクトルを表すことが簡単にできます。

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

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

この例では、3 次元座標 x、y、z を使用してタプル オブジェクトを定義します。オブジェクト要素は 3 つあり、座標値を通じて対応する値を参照できます。

from collections import namedtuple
from collections import deque
from collections import defaultdict
from collections import OrderedDict
from collections import Counter
def testNamedTuple():
vector=namedtuple('vector',['x','y','z'])
flag=vector(3,4,5)
print(type(flag))
print(isinstance(flag,vector))
print(isinstance(flag,tuple)) #通过这里的判定我们就可以知晓它是元组类型
print(flag.x,flag.y,flag.z)

(2) testDeque 関数

deque はスタックとキューを一般化した実装であり、deque は「double-end queue」の略です。

Deque は、約 O(1) のパフォーマンスで、スレッド セーフでメモリ効率の高い、deque の両端の要素の挿入と削除をサポートします。list も同様の操作をサポートしますが、主に固定長操作用に最適化されています。その結果、pop(0) と insert(0,v) の時間計算量は O(n) になります (データの位置とサイズが変更されます)。

データ構造では、キューとスタックの 2 つの非常に重要なデータ型がわかっています。1 つは先入れ先出しで、もう 1 つは後入れ先出しです。

Python では、リストを使用してデータを保存する場合、インデックスによる要素へのアクセスは非常に高速ですが、要素の挿入と削除は非常に遅くなります。これは、リストが線形ストレージであるためであり、データ量が大きい場合、効率が低下します。挿入と削除の頻度は非常に低いです。

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

def testDeque():
list1=[x*x for x in range(101)]
delist=deque(list1) #对列表进行了一次再处理,让list1列表变成了双向链表结构
delist.append(1000)#将x添加到deque的右侧
delist.appendleft(2000)#将x添加到deque的左侧
delist.pop(1000)#移除和返回deque中最右侧的元素,如果没有元素,将会报出IndexError;
delist.popleft()#移除和返回deque中最左侧的元素,如果没有元素,将会报出IndexError;
delist.count(1)#返回deque中元素等于1的个数
delist.remove(10000)#移除第一次出现的value,如果没有找到,报出ValueError;
delist.reverse()#反转deque中的元素,并返回None;
list2=[1,3,4,5]
delist.extend(list2)#将可迭代变量iterable中的元素添加至deque的右侧
delist.extendleft(list2)#将变量iterable中的元素添加至deque的左侧,往左侧添加序列的顺序与可迭代变量iterable中的元素相反
delist.maxlen()#只读的属性,deque的最大长度,如果无解,就返回None
delist.rotate(1)#从右侧反转n步,如果n为负数,则从左侧反转
delist.clear()#将deque中的元素全部删除,最后长度为0;

(3)testDefaultdict function

defaultdict は、組み込みデータ型 dict のサブクラスです。その基本的な機能は、メソッド __missing__(key) をオーバーライドする点を除いて、dict と同じです。そして書き込み可能なオブジェクト変数default_factoryを追加します。

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

def testDefaultdict():
dict1= defaultdict(lambda: 'default') #Key不存在时,返回一个默认值,就可以用default,defaultdict的其他行为跟dict是完全一样的
dict1["k1"]="v1"
print(dict1["k2"])
list2= [('yellow',11),('blue',2),('yellow',3),('blue',4),('red',5),('red',10)]
dict1 = defaultdict(list)#使用list作为default_factory,很容易将一个key-value的序列转换为一个关于list的词典
for k,v in list2:
dict1[k].append(v)
print(dict1)

(4) testOrderedDict 関数

OrderedDict は、要素が挿入される順序を記憶する点を除いて、通常の辞書に似ています。順序付けられた辞書を反復処理する場合、返される要素は次のとおりです。最初の追加の順序。このように、dict は順序付けされた辞書です。

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

def testOrderedDict():
dict1=dict([('aaa', 111), ('ddd',444),('bbb', 222), ('ccc', 333)])
print(dict1)
dict2 = OrderedDict([('ddd',444),('aaa', 111), ('bbb', 222), ('ccc', 333)])#OrderedDict的key会按照插入的顺序排列,不是key本身排序
print(dict2)
dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444}
# dict sorted by key
dict4=OrderedDict(sorted(dict3.items(), key=lambda t: t[0]))
print("dict4",dict4)
# dict sorted by value
dict5=OrderedDict(sorted(dict3.items(), key=lambda t: t[1]))
print("dict5",dict5)
# dict sorted by length of key string
dict6 = OrderedDict(sorted(dict3.items(), key=lambda t: len(t[0])))
print("dict6",dict6)
print(dict6['apple'])

(5) testCounter関数

def testCounter():
'''counter可以支持方便、快速的计数'''
str1="abcdefgabcedergeghdjlkabcdefe" #将可迭代的字符串初始化counter
str2=Counter(str1)
print(str2) #从输出的内容来看,Counter实际上也是dict的一个子类
for k,v in str2.items():
print(k,v)
dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444,"apples":2}#将dict初始化counter
dict4=Counter(dict3)
print(dict4)
print(dict4["test"])#Counter对象类似于字典,如果某个项缺失,会返回0,而不是报出KeyError;
dict5=Counter(high=9,age=33,money=-1)#将args初始化counter
print(dict5)
#elements返回一个迭代器,每个元素重复的次数为它的数目,顺序是任意的顺序,如果一个元素的数目少于1,那么elements()就会忽略它;
list1=list(dict5.elements())
print(list1)
#most_common返回一个列表,包含counter中n个最大数目的元素
#,如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会以任意顺序排列;
str1 = "abcdefgabcedergeghdjlkabcdefe"
list1=Counter(str1).most_common(3)
print(list1)
if __name__ == '__main__':
# testNamedTuple()
# testCounter()
testDefaultdict()
# testDeque()
# testOrderedDict()

以上がPython の組み込みモジュールである Collections について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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