>  기사  >  백엔드 개발  >  Python의 내장 모듈인 컬렉션에 대해 이야기해 보겠습니다.

Python의 내장 모듈인 컬렉션에 대해 이야기해 보겠습니다.

王林
王林앞으로
2023-04-12 12:46:081148검색

Python의 내장 모듈인 컬렉션에 대해 이야기해 보겠습니다.

1. 모듈 설명

collections은 Python의 내장 모듈입니다. 소위 내장 모듈은 모듈이 Python 내부에 패키지되어 설치 없이 바로 사용할 수 있다는 의미입니다.

  • 컬렉션에는 list, dict, set, tuple과 같은 Python의 내장 컨테이너에 대한 대안을 제공하는 몇 가지 특수 컨테이너가 포함되어 있습니다.
  • 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도 유사한 작업을 지원하지만 주로 고정 길이 작업을 최적화하므로 팝이 더 쉬워집니다. (0)과 insert(0,v)(데이터의 위치와 크기를 변경함)의 시간 복잡도는 O(n)입니다.

데이터 구조에서 우리는 큐와 스택이 두 가지 매우 중요한 데이터 유형이라는 것을 알고 있습니다. 하나는 선입선출이고 다른 하나는 후입선출입니다.

파이썬에서는 리스트를 사용하여 데이터를 저장할 때 인덱스로 요소에 접근하는 것은 매우 빠르지만, 리스트는 선형 저장이기 때문에 요소를 삽입하고 삭제하는 것은 매우 느리고, 데이터의 양이 많을 경우 삽입과 삭제의 효율성이 떨어집니다. 매우 낮습니다.

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 함수

defaultdict는 내장 데이터 유형 dict의 하위 클래스입니다. 기본 기능은 __missing__(key) 메서드를 재정의하고 쓰기 가능한 개체 변수 default_factory를 추가한다는 점을 제외하면 dict와 동일합니다.

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를 사용할 때 키는 순서가 지정되지 않습니다. 사전을 반복할 때 키의 순서를 결정할 수 없습니다. 그러나 키 순서를 유지하려면 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의 내장 모듈인 컬렉션에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제