>  기사  >  백엔드 개발  >  Python 내장 모듈 컬렉션 소개

Python 내장 모듈 컬렉션 소개

angryTom
angryTom앞으로
2019-11-30 15:45:214728검색

Python 내장 모듈 컬렉션 소개

Python의 내장 모듈 컬렉션 소개

collections는 많은 유용한 컬렉션 클래스를 제공하는 Python의 내장 컬렉션 모듈입니다.

1.namedtuple

Python은 이진 벡터를 나타내는 데 쉽게 사용할 수 있는 불변 유형 튜플과 같은 매우 유용한 기본 유형을 많이 제공합니다.

추천 학습: Python 동영상 튜토리얼

>>> v = (2,3)

(2,3)은 벡터의 두 좌표를 나타내지만 추가 설명 없이는 이 튜플이 좌표를 나타내는 데 사용되는지 직접 확인하기 어렵다는 것을 발견했습니다.

이를 위해 클래스를 정의하는 것은 너무 까다롭습니다. 이때, namestuple이 유용합니다.

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

마찬가지로 좌표와 반경을 사용하여 원을 표현하려는 경우 명명된 튜플을 사용하여 다음을 정의할 수도 있습니다.

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

2, deque

데이터 구조에서는 큐와 스택이 매우 중요하다는 것을 알고 있습니다. 데이터 유형, 하나는 선입선출(First In First Out), 하나는 마지막에 들어간 선출(Last In First Out)입니다. 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])

deque는 목록의 append()와 pop() 구현 외에도 appendleft()와 popleft()도 지원하므로 헤드에 요소를 매우 효율적으로 추가하거나 삭제할 수 있습니다.

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 자체도 dict이지만, 검색 시에는 내부 dict를 순서대로 검색하게 됩니다.

체인맵을 사용하기 가장 좋은 시기는 언제인가요? 예: 애플리케이션은 종종 매개변수를 전달해야 합니다. 매개변수는 명령줄을 통해 전달되거나 환경 변수를 통해 전달될 수 있으며 기본 매개변수를 가질 수도 있습니다. ChainMap을 사용하여 매개변수 우선순위 검색을 구현할 수 있습니다. 즉, 전달되지 않은 경우 먼저 명령줄 매개변수를 확인한 다음 환경 변수를 확인하고 그렇지 않은 경우 기본 매개변수를 사용합니다.

다음 코드는 user 및 color 두 매개변수를 찾는 방법을 보여줍니다.

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는 나타나는 문자 수를 계산하는 간단한 카운터입니다.

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. 요약

collections 모듈은 필요에 따라 선택할 수 있는 몇 가지 유용한 컬렉션 클래스를 제공합니다.


위 내용은 Python 내장 모듈 컬렉션 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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