파이썬 Collections 모듈 자료형 알아보기 - defaultdict, Counter, deque, namedtuple, OrderedDict

728x90

Python collections 모듈의 다양한 자료형 자세히 알아보기

Python의 collections 모듈은 기본적인 데이터 구조 외에도 효율적이고 유용한 컨테이너 자료형을 제공한다. 이를 활용하면 코드의 간결성과 성능을 크게 향상시킬 수 있다. 이번 글에서는 collections 모듈에 포함된 주요 자료형들을 자세히 살펴본다.


1. defaultdict

defaultdict는 딕셔너리와 유사하지만, 존재하지 않는 키를 참조할 때 KeyError를 발생시키는 대신 기본값을 자동으로 생성한다.

사용법

from collections import defaultdict

# 기본값이 정수형(0)인 defaultdict 생성
d = defaultdict(int)

# 키가 없으면 기본값 생성
d['a'] += 1
print(d['a'])  # 출력: 1
print(d['b'])  # 출력: 0

특징

  • 딕셔너리의 기본값을 정의할 수 있다.
  • 기본값 생성 함수는 default_factory에 전달한다.
  • 예를 들어, 리스트를 기본값으로 설정하면 키마다 빈 리스트를 자동 생성한다.
d = defaultdict(list)
d['a'].append(10)
d['b'].append(20)
print(d)  # 출력: {'a': [10], 'b': [20]}

활용 예

  • 데이터를 분류하거나 그룹화할 때 유용하다.
words = ["apple", "banana", "cherry", "apricot"]
grouped = defaultdict(list)
for word in words:
    grouped[word[0]].append(word)
print(grouped)  # 출력: {'a': ['apple', 'apricot'], 'b': ['banana'], 'c': ['cherry']}

2. Counter

Counter는 요소의 개수를 세기 위한 자료형이다. 내부적으로 딕셔너리를 기반으로 하며, 키는 요소를, 값은 해당 요소의 개수를 저장한다.

사용법

from collections import Counter

# 리스트에서 각 요소의 개수 세기
counts = Counter(["apple", "banana", "apple", "cherry", "banana", "apple"])
print(counts)  # 출력: Counter({'apple': 3, 'banana': 2, 'cherry': 1})

주요 메서드

  • most_common(n): 가장 많이 등장한 요소 n개를 반환한다.
  • update(iterable): 기존 Counter 객체에 새로운 요소를 추가한다.
  • subtract(iterable): 요소의 개수를 감산한다.

활용 예

  • 텍스트 분석에서 단어 빈도를 계산할 때 유용하다.
text = "apple banana apple cherry banana apple"
words = text.split()
word_counts = Counter(words)
print(word_counts.most_common(2))  # 출력: [('apple', 3), ('banana', 2)]

3. deque

deque(Double-Ended Queue)는 양쪽 끝에서 삽입과 삭제가 가능한 자료구조다. 스택과 큐의 장점을 모두 가지고 있으며, 양쪽 끝에서의 작업이 O(1)로 매우 빠르다.

사용법

from collections import deque

# deque 생성
d = deque([1, 2, 3])

# 양쪽 끝에서 삽입 및 삭제
d.append(4)       # 오른쪽 끝에 추가
d.appendleft(0)   # 왼쪽 끝에 추가
print(d)          # 출력: deque([0, 1, 2, 3, 4])

d.pop()           # 오른쪽 끝에서 제거
d.popleft()       # 왼쪽 끝에서 제거
print(d)          # 출력: deque([1, 2, 3])

주요 메서드

  • append(x): 오른쪽 끝에 x 추가
  • appendleft(x): 왼쪽 끝에 x 추가
  • pop(): 오른쪽 끝 요소 제거
  • popleft(): 왼쪽 끝 요소 제거
  • rotate(n): 요소를 회전시킨다. 양수는 오른쪽, 음수는 왼쪽으로 회전한다.

활용 예

  • 슬라이딩 윈도우 문제나 큐 구현에서 유용하다.
# 슬라이딩 윈도우 합 계산
nums = [1, 2, 3, 4, 5]
window_size = 3
d = deque(nums[:window_size])
current_sum = sum(d)
print(current_sum)  # 출력: 6

for num in nums[window_size:]:
    d.append(num)
    current_sum += num - d.popleft()
    print(current_sum)  # 출력: 9, 12

4. namedtuple

namedtuple은 튜플의 확장형으로, 인덱스가 아닌 이름으로 필드에 접근할 수 있는 자료형이다.

사용법

from collections import namedtuple

# namedtuple 생성
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)

# 필드 접근
print(p.x)  # 출력: 10
print(p.y)  # 출력: 20

특징

  • 튜플처럼 불변(immutable)하다.
  • 필드 이름으로 가독성을 높인다.

활용 예

  • 데이터를 구조화하고 읽기 쉽게 표현할 때 유용하다.
# 학생 정보를 구조화
def calculate_average(students):
    Student = namedtuple('Student', ['name', 'math', 'science'])
    total_math = total_science = 0

    for student in students:
        s = Student(*student)
        total_math += s.math
        total_science += s.science

    return total_math / len(students), total_science / len(students)

students = [
    ('Alice', 90, 85),
    ('Bob', 80, 78),
    ('Charlie', 95, 92)
]
print(calculate_average(students))  # 출력: (88.33333333333333, 85.0)

5. OrderedDict

OrderedDict는 입력 순서를 유지하는 딕셔너리다. Python 3.7 이상에서는 기본 딕셔너리도 순서를 유지하지만, OrderedDict는 이와 관련된 추가 메서드를 제공한다.

사용법

from collections import OrderedDict

# OrderedDict 생성
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d)  # 출력: OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 순서 유지
for key, value in d.items():
    print(key, value)

주요 메서드

  • move_to_end(key, last=True): 특정 키를 맨 끝이나 맨 앞으로 이동한다.
  • popitem(last=True): 마지막 또는 첫 번째 항목을 제거한다.

결론

Python의 collections 모듈은 다양한 자료형을 제공하여 복잡한 데이터 구조를 간단하게 구현할 수 있도록 돕는다. defaultdict, Counter, deque, namedtuple, OrderedDict는 각각의 강점과 특성을 가지고 있으며, 이를 적절히 활용하면 코드의 효율성과 가독성을 크게 향상시킬 수 있다. 필요에 따라 적절한 자료형을 선택하여 문제를 해결해 보자!

728x90