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
는 각각의 강점과 특성을 가지고 있으며, 이를 적절히 활용하면 코드의 효율성과 가독성을 크게 향상시킬 수 있다. 필요에 따라 적절한 자료형을 선택하여 문제를 해결해 보자!
'Programming > Python' 카테고리의 다른 글
Python bisect - 파이썬 이진탐색 기본 라이브러리 알아보기 (0) | 2025.01.04 |
---|---|
파이썬 리스트 딕셔너리 차이점 알아보기 (0) | 2025.01.01 |
파이썬 전역 변수, 지역 변수, 클래스 변수 - 변수 Scope 알아보기 (0) | 2024.12.12 |
[Python] 자원최적화 비동기 프로그래밍 적용하기 - Asyncio (0) | 2024.11.29 |
[Pandas] 판다스 데이터프레임 컬럼 전처리, 함수 컬럼 적용 - apply, map (0) | 2024.11.24 |