Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python collections 모듈 완벽 정리: 컨테이너 데이터 타입 총정리

Python의 collections 모듈에는 dict, list, set 같은 기본 내장 컨테이너를 대체하거나 확장할 수 있는 다양한 컨테이너 데이터 타입이 포함되어 있습니다. 이러한 컨테이너들은 상황에 따라 더 나은 성능과 편의성을 제공합니다.

주요 컨테이너 데이터 타입

collections 모듈에서 제공하는 대표적인 컨테이너는 다음과 같습니다.

번호컨테이너 및 설명
1namedtuple()
필드 이름을 가진 튜플 서브클래스를 생성합니다.
2deque
양쪽 끝에서 빠른 삽입과 삭제가 가능한 큐(Queue) 자료구조입니다.
3Counter
해시 가능한 객체를 세기 위한 dict의 서브클래스입니다.
4ChainMap
여러 개의 매핑(mapping)을 하나의 뷰로 통합합니다.
5OrderedDict
항목이 입력된 순서를 기억하는 dict의 서브클래스입니다.
6UserList
list를 더 쉽게 사용할 수 있도록 감싸는 래퍼(Wrapper) 클래스입니다.

이 모듈을 사용하려면 먼저 임포트해야 합니다.

import collections

Deque 객체

Deque(Double-Ended Queue)는 스택과 큐 구조를 일반화한 자료구조로, 양쪽 방향 모두에서 요소를 추가하거나 제거할 수 있습니다. 데크는 리스트 객체를 기반으로 생성되며, 왼쪽에서 오른쪽 방향으로 초기화됩니다.

데크에서 자주 사용되는 주요 메서드는 다음과 같습니다.

번호메서드 및 설명
1append(x)
데크의 오른쪽 끝에 요소 x를 추가합니다.
2appendleft(x)
데크의 왼쪽 끝에 요소 x를 추가합니다.
3clear()
데크의 모든 요소를 삭제합니다.
4count(x)
데크에서 x가 등장하는 횟수를 반환합니다.
5index(x[, start[, stop]])
x의 위치를 반환합니다. start와 stop이 지정되면 해당 범위 내에서만 검색합니다.
6insert(i, x)
위치 i에 요소 x를 삽입합니다.
7pop()
오른쪽 끝에서 요소를 제거하고 반환합니다.
8popleft()
왼쪽 끝에서 요소를 제거하고 반환합니다.
9reverse()
데크의 요소 순서를 뒤집습니다.
10rotate(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에서 자주 사용되는 주요 메서드는 다음과 같습니다.

번호메서드 및 설명
1elements()
카운터 값만큼 각 요소를 반복하여 반환합니다.
2most_common([n])
가장 많이 등장한 n개의 요소를 리스트로 반환합니다. n을 지정하지 않으면 전체를 반환합니다.
3subtract(iterable 또는 mapping)
키가 일치하는 항목끼리 두 카운터 객체의 값을 뺍니다.
4update(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의 주요 멤버는 다음과 같습니다.

번호멤버 및 설명
1maps
체인에 포함된 딕셔너리들과 해당 키·값들을 반환합니다.
2new_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을 활용해 보세요. 이러한 컨테이너를 잘 활용하면 코드의 가독성과 성능을 동시에 향상시킬 수 있습니다.