공부/자료구조,알고리즘_python

1. 파이썬 고급 자료구조 collections

ha2yong 2025. 10. 22. 13:55
클래스 핵심 목적 주요 특징/ 사용 예시
namedtuple 튜플의 필드에 이름 부여 불변(immutable) 구조, 클래스처럼 필드 접근
deque 양쪽에서 빠른 삽입/삭제 스택·큐·슬라이딩 윈도우 구현에 최적
Counter 요소 개수 세기 리스트/문자열의 빈도 분석
defaultdict 기본값을 갖는 딕셔너리 존재하지 않는 키 접근 시 자동 초기화
OrderedDict 순서가 유지되는 딕셔너리 LRU Cache 등 순서 기반 로직 구현
ChainMap 여러 딕셔너리를 묶어 하나처럼 다룸 다중 스코프 환경에서 키 검색
UserDict, UserList, UserString 커스텀 자료형 구현용 Wrapper 상속/오버라이드로 사용자 정의 자료구조 만들 때

 

1. namedtuple

튜플은 순서로만 접근한다.
하지만 필드 이름으로 접근하면 코드 가독성이 훨씬 좋아진다.

from collections import namedtuple

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

print(p.x, p.y)   # 10 20

✅ 메모리 효율 높음
✅ 클래스보다 가볍고 빠름
✅ 불변(immutable)

 

2. deque — 양방향 큐 (Double-ended Queue)

리스트는 중간 삽입/삭제가 느리지만,
deque는 양쪽 끝 삽입/삭제가 모두 O(1) 이다.

from collections import deque

dq = deque([1, 2, 3])
dq.append(4)        # 오른쪽 삽입
dq.appendleft(0)    # 왼쪽 삽입
dq.pop()            # 오른쪽 삭제
dq.popleft()        # 왼쪽 삭제

✅ 큐, 스택, 슬라이딩 윈도우 등에 활용
✅ 내부적으로 양방향 링크드리스트 기반

 

3. Counter — 항목의 빈도(개수) 계산

from collections import Counter

cnt = Counter("banana")
print(cnt)          # Counter({'a': 3, 'n': 2, 'b': 1})
print(cnt.most_common(2))  # [('a', 3), ('n', 2)]

✅ 문자열, 리스트, 로그 등 빈도 분석에 강력
✅ 덧셈/뺄셈 연산도 가능

a = Counter("hello")
b = Counter("world")
print(a + b)  # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})

 

 

4. defaultdict — 기본값이 있는 딕셔너리

from collections import defaultdict

d = defaultdict(int)  # 기본값 0
d['apple'] += 1
print(d)  # defaultdict(<class 'int'>, {'apple': 1})

✅ 키가 없을 때 자동 초기화 (KeyError 없음)
✅ 기본값 타입은 int, list, set 등 지정 가능

words = ['apple', 'banana', 'apple']
group = defaultdict(list)
for w in words:
    group[w[0]].append(w)
# {'a': ['apple', 'apple'], 'b': ['banana']}

 

 

5. OrderedDict — 순서를 기억하는 딕셔너리

파이썬 3.7 이상부터 기본 dict도 순서를 유지하지만,
OrderedDict는 순서 조작 메서드(move_to_end 등) 이 추가로 제공된다.

from collections import OrderedDict

od = OrderedDict()
od['a'] = 1
od['b'] = 2
od.move_to_end('a')   # a를 맨 뒤로
print(od)             # OrderedDict([('b', 2), ('a', 1)])

✅ LRU Cache 구현 시 자주 사용됨

 

6. ChainMap — 여러 딕셔너리 묶기

from collections import ChainMap

defaults = {'theme': 'light', 'lang': 'en'}
user = {'lang': 'ko'}
config = ChainMap(user, defaults)

print(config['lang'])   # ko (user 우선)
print(config['theme'])  # light (defaults에서 가져옴)

✅ 여러 설정 파일, 환경 변수 계층 구조 관리에 유용
✅ 조회 시 앞쪽 딕셔너리부터 탐색

 

7. UserDict, UserList, UserString — 사용자 정의 확장

from collections import UserDict

class MyDict(UserDict):
    def __getitem__(self, key):
        print(f"Accessing {key}")
        return super().__getitem__(key)

d = MyDict({'a': 1})
print(d['a'])

✅ 커스텀 자료형 제작 시 안전하고 직관적