Python의 collections 모듈에는 dict, list, set 같은 기본 내장 컨테이너를 대체하거나 확장할 수 있는 다양한 컨테이너 데이터 타입이 포함되어 있습니다. 이러한 컨테이너들은 상황에 따라 더 나은 성능과 편의성을 제공합니다.
주요 컨테이너 데이터 타입
collections 모듈에서 제공하는 대표적인 컨테이너는 다음과 같습니다.
| 번호 | 컨테이너 및 설명 |
|---|---|
| 1 | namedtuple() 필드 이름을 가진 튜플 서브클래스를 생성합니다. |
| 2 | deque 양쪽 끝에서 빠른 삽입과 삭제가 가능한 큐(Queue) 자료구조입니다. |
| 3 | Counter 해시 가능한 객체를 세기 위한 dict의 서브클래스입니다. |
| 4 | ChainMap 여러 개의 매핑(mapping)을 하나의 뷰로 통합합니다. |
| 5 | OrderedDict 항목이 입력된 순서를 기억하는 dict의 서브클래스입니다. |
| 6 | UserList list를 더 쉽게 사용할 수 있도록 감싸는 래퍼(Wrapper) 클래스입니다. |
이 모듈을 사용하려면 먼저 임포트해야 합니다.
import collections
Deque 객체
Deque(Double-Ended Queue)는 스택과 큐 구조를 일반화한 자료구조로, 양쪽 방향 모두에서 요소를 추가하거나 제거할 수 있습니다. 데크는 리스트 객체를 기반으로 생성되며, 왼쪽에서 오른쪽 방향으로 초기화됩니다.
데크에서 자주 사용되는 주요 메서드는 다음과 같습니다.
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | append(x) 데크의 오른쪽 끝에 요소 x를 추가합니다. |
| 2 | appendleft(x) 데크의 왼쪽 끝에 요소 x를 추가합니다. |
| 3 | clear() 데크의 모든 요소를 삭제합니다. |
| 4 | count(x) 데크에서 x가 등장하는 횟수를 반환합니다. |
| 5 | index(x[, start[, stop]]) x의 위치를 반환합니다. start와 stop이 지정되면 해당 범위 내에서만 검색합니다. |
| 6 | insert(i, x) 위치 i에 요소 x를 삽입합니다. |
| 7 | pop() 오른쪽 끝에서 요소를 제거하고 반환합니다. |
| 8 | popleft() 왼쪽 끝에서 요소를 제거하고 반환합니다. |
| 9 | reverse() 데크의 요소 순서를 뒤집습니다. |
| 10 | rotate(n=1) 데크를 오른쪽으로 n번 회전시킵니다. |
예제 코드
import collections as col
my_deque = col.deque('124dfre')
print(my_deque)
print("Popped Item: " + str(my_deque.pop()))
print("Popped Item From Left: " + str(my_deque.popleft()))
print(my_deque)실행 결과
deque(['1', '2', '4', 'd', 'f', 'r', 'e']) Popped Item: e Popped Item From Left: 1 deque(['2', '4', 'd', 'f', 'r'])
Counter 객체
Counter는 dict 타입의 서브클래스로, 해시 가능한 객체의 개수를 손쉽게 셀 수 있습니다. 카운터 값은 정수만 허용됩니다.
Counter에서 자주 사용되는 주요 메서드는 다음과 같습니다.
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | elements() 카운터 값만큼 각 요소를 반복하여 반환합니다. |
| 2 | most_common([n]) 가장 많이 등장한 n개의 요소를 리스트로 반환합니다. n을 지정하지 않으면 전체를 반환합니다. |
| 3 | subtract(iterable 또는 mapping) 키가 일치하는 항목끼리 두 카운터 객체의 값을 뺍니다. |
| 4 | update(iterable 또는 mapping) 키가 일치하는 항목의 기존 값을 대체하지 않고 값을 더합니다. |
예제 코드
import collections as col
text_list = ['ABC','PQR','ABC','ABC','PQR','Mno','xyz','PQR','ABC','xyz']
my_counter = col.Counter()
for element in text_list:
my_counter[element] += 1
print(my_counter)
print(my_counter.most_common(2))실행 결과
Counter({'ABC': 4, 'PQR': 3, 'xyz': 2, 'Mno': 1})
[('ABC', 4), ('PQR', 3)]ChainMap 객체
ChainMap은 여러 개의 딕셔너리를 하나의 단위로 묶어 관리할 수 있게 해줍니다. 여러 매핑을 검색할 때 첫 번째 매핑부터 순차적으로 탐색합니다.
ChainMap의 주요 멤버는 다음과 같습니다.
| 번호 | 멤버 및 설명 |
|---|---|
| 1 | maps 체인에 포함된 딕셔너리들과 해당 키·값들을 반환합니다. |
| 2 | new_child(m=None) 새로운 딕셔너리를 체인의 맨 앞에 삽입합니다. |
예제 코드
import collections as col
con_code1 = {'India' : 'IN', 'China' : 'CN'}
con_code2 = {'France' : 'FR', 'United Kingdom' : 'GB'}
code = {'Japan' : 'JP'}
chain = col.ChainMap(con_code1, con_code2)
print("Initial Chain: " + str(chain.maps))
chain = chain.new_child(code) # 새로운 자식 딕셔너리 삽입
print("Final Chain: " + str(chain.maps))실행 결과
Initial Chain: [{'India': 'IN', 'China': 'CN'}, {'France': 'FR', 'United Kingdom': 'GB'}]
Final Chain: [{'Japan': 'JP'}, {'India': 'IN', 'China': 'CN'}, {'France': 'FR', 'United Kingdom': 'GB'}]마무리
Python의 collections 모듈은 기본 자료형만으로는 해결하기 어려운 문제를 효율적으로 처리할 수 있게 도와줍니다. 양방향 큐가 필요하면 deque, 빈도 계산이 필요하면 Counter, 여러 딕셔너리를 통합해야 한다면 ChainMap을 활용해 보세요. 이러한 컨테이너를 잘 활용하면 코드의 가독성과 성능을 동시에 향상시킬 수 있습니다.