collections 모듈

신병규·2023년 3월 18일
0
post-thumbnail

collections — 컨테이너 데이터형

파이썬의 collections 모듈은 내장 자료구조를 확장한 고급 컨테이너 데이터 타입을 제공합니다. 이러한 데이터 타입은 일반적인 데이터 조작 작업을 보다 편리하고 효율적으로 수행할 수 있도록 설계되었습니다.

collections 모듈에서 제공하는 몇 가지 주요 컨테이너는 다음과 같습니다:

namedtuple : 일반 튜플(tuple)과 비슷하지만, 각 요소에 이름을 부여할 수 있는 튜플입니다. namedtuple을 사용하면 코드의 가독성을 향상시키고 실수를 줄일 수 있습니다.

from collections import namedtuple

Person = namedtuple('Person', ['name', 'age', 'city'])
person = Person('John', 30, 'New York')

deque : 양쪽 끝에서 빠르게 삽입 및 삭제를 수행할 수 있는 양방향 큐(double-ended queue)입니다. 일반 리스트와 비교하여 큐의 양쪽 끝에서 작업을 수행하는 데에 효율적입니다.

from collections import deque

queue = deque([1, 2, 3, 4, 5])
queue.appendleft(0)  # 왼쪽에 추가
queue.append(6)      # 오른쪽에 추가
queue.popleft()       # 왼쪽 요소 제거
queue.pop()           # 오른쪽 요소 제거

Counter : 주어진 데이터에서 요소의 개수를 계산하는 데 사용되는 딕셔너리 서브클래스입니다. 가장 일반적인 요소를 쉽게 찾거나 요소의 개수를 구하는 작업을 간단히 수행할 수 있습니다.

from collections import Counter

data = [1, 2, 3, 2, 1, 1, 1, 2, 3, 4, 5, 4, 5]
counter = Counter(data)

OrderedDict : 삽입 순서를 기억하는 딕셔너리입니다. 파이썬 3.7 이상에서는 일반 딕셔너리도 삽입 순서를 유지하므로, 이전 버전에서 주로 사용됩니다.

from collections import OrderedDict

ordered_dict = OrderedDict()
ordered_dict['first'] = 1
ordered_dict['second'] = 2
ordered_dict['third'] = 3

ChainMap : 여러 개의 딕셔너리를 단일 매핑으로 관리할 수 있게 해주는 컨테이너입니다. 이를 통해 여러 딕셔너리를 하나로 병합하는 것이 아닌, 단일 뷰에서 참조할 수 있습니다.

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain_map = ChainMap(dict1, dict2)

UserDict, UserList, UserString : 이들은 각각 dict, list, str의 사용자 정의 버전을 작성할 때 사용하는 기본 클래스입니다. 이들 클래스를 상속받아 사용자 정의 컨테이너를 작성할 때 필요한 메서드를 재정의(override)하여 사용합니다.

from collections import UserDict

class CustomDict(UserDict):
    def custom_method(self):
        # 여기에 사용자 정의 메서드 구현
        pass

defaultdict

기본값을 가지는 딕셔너리입니다. 내장 dict 클래스를 확장한 것으로 기본적으로는 defaultdict는 일반 딕셔너리와 동일하게 작동하지만, 주요 차이점은 키(key)가 존재하지 않을 경우에 기본값을 반환한다는 것입니다.

defaultdict를 생성할 때, 기본값을 반환하는 함수를 인수로 전달해야 합니다. 예를 들어, 키가 없을 때 기본값으로 리스트를 반환하고자 한다면 list를 인수로 전달하면 됩니다.

d = defaultdict(list)

이제 d라는 defaultdict 객체를 사용할 수 있습니다. 키가 존재하지 않는 경우, 빈 리스트를 반환합니다:

print(d["nonexistent_key"])  # 출력: []

이렇게 하면 키가 없을 때마다 기본값을 설정하는 코드를 작성하지 않아도 됩니다. 이는 예를 들어 그래프의 인접 리스트를 만들 때 유용할 수 있습니다. 일반적인 딕셔너리를 사용하면 다음과 같이 작성해야 합니다:

graph = {}
for edge in edges:
    a, b = edge
    if a not in graph:
        graph[a] = []
    if b not in graph:
        graph[b] = []
    graph[a].append(b)
    graph[b].append(a)

하지만 defaultdict를 사용하면 코드를 단순화할 수 있습니다:

graph = defaultdict(list)
for edge in edges:
    a, b = edge
    graph[a].append(b)
    graph[b].append(a)

defaultdict는 코드를 더 간결하고 가독성 있게 만들 수 있으며, 특정 상황에서는 성능 향상을 가져올 수도 있습니다.

0개의 댓글