Python의 collections 모듈 심층 분석

collections 모듈은 파이썬 내장 컨테이너 타입을 확장한 다양한 자료구조를 제공합니다. 각각의 특징과 활용법을 자세히 알아보겠습니다.

1. namedtuple: 이름 있는 튜플

namedtuple은 일반 튜플의 고정된 구조를 유지하면서도 각 요소에 이름을 부여하여 가독성과 접근성을 높입니다.

from collections import namedtuple

# 2D 좌표계 예시
Coordinate = namedtuple('Coordinate', ['x', 'y'])
point = Coordinate(10, 20)
print(point)           # Coordinate(x=10, y=20)
print(point.x)         # 10
print(point.y)         # 20

# 카드 게임 예시
Card = namedtuple('Card', ['suit', 'rank'])
my_card = Card('Spade', 'A')
print(my_card)         # Card(suit='Spade', rank='A')
print(my_card.suit)    # Spade
print(my_card.rank)    # A

2. deque: 양방향 큐

deque는 스택과 큐의 특징을 모두 가진 자료구조입니다. 양쪽 끝에서 효율적인 삽입과 삭제가 가능합니다.

from collections import deque

# 빈 deque 생성
dq = deque()

# 오른쪽에 요소 추가
dq.append(1)
dq.append(2)

# 왼쪽에 요소 추가
dq.appendleft(0)

print(dq)  # deque([0, 1, 2])

# 요소 추출
right_item = dq.pop()      # 2
left_item = dq.popleft()   # 0

print(dq)  # deque([1])

# 최대 길이 제한
limited_dq = deque(maxlen=3)
for i in range(5):
    limited_dq.append(i)
print(limited_dq)  # deque([2, 3, 4], maxlen=3)

3. OrderedDict: 순서가 있는 딕셔너리

파이썬 3.7부터 일반 딕셔너리도 삽입 순서를 유지하지만, OrderedDict는 순서 관련 추가 메서드를 제공합니다.

from collections import OrderedDict

# 삽입 순서 유지
ordered = OrderedDict()
ordered['z'] = 1
ordered['a'] = 2
ordered['c'] = 3

for key, value in ordered.items():
    print(key, value)
# z 1
# a 2
# c 3

# 순서 변경 가능
ordered.move_to_end('a')
print(ordered)  # OrderedDict([('z', 1), ('c', 3), ('a', 2)])

4. defaultdict: 기본값을 가진 딕셔너리

존재하지 않는 키에 접근할 때 KeyError 대신 기본값을 반환합니다.

from collections import defaultdict

# 기본값이 0인 딕셔너리
counter = defaultdict(int)
words = ['apple', 'banana', 'apple', 'orange', 'banana']

for word in words:
    counter[word] += 1

print(counter)  # defaultdict(<class 'int'>, {'apple': 2, 'banana': 2, 'orange': 1})

# 기본값이 리스트인 딕셔너리
group_dict = defaultdict(list)
data = [('fruit', 'apple'), ('fruit', 'banana'), ('color', 'red')]

for key, value in data:
    group_dict[key].append(value)

print(group_dict)  # defaultdict(<class 'list'>, {'fruit': ['apple', 'banana'], 'color': ['red']})

5. Counter: 요소 개수 세기

반복 가능한 객체에서 각 요소의 등장 횟수를 딕셔너리 형태로 반환합니다.

from collections import Counter

# 문자열 분석
text = "hello world hello python hello"
word_count = Counter(text.split())
print(word_count)  # Counter({'hello': 3, 'world': 1, 'python': 1})

# 리스트 분석
numbers = [1, 2, 3, 1, 2, 1, 4, 5, 5]
num_counter = Counter(numbers)
print(num_counter)  # Counter({1: 3, 2: 2, 5: 2, 3: 1, 4: 1})

# 가장 흔한 요소 찾기
print(num_counter.most_common(2))  # [(1, 3), (2, 2)]

태그: collections namedtuple deque OrderedDict defaultdict

7월 4일 22:15에 게시됨