파이썬 자료 구조

파이썬 자료 구조

파이썬에는 목록(list) 하나만으로도 많은 일을 할 수 있는데, 상황에 따라 더 알맞은 컬렉션을 고르면 코드가 훨씬 자연스러워져요. 이번에는 목록이 제공하는 메서드들을 차근차근 짚어보고, 튜플·집합·딕셔너리처럼 각각 어떤 문제를 풀기 위해 만들어진 건지 함께 살펴볼게요. 목록의 메서드만 익혀도 스택부터 큐까지 아주 많은 패턴을 그대로 구현할 수 있어요.

출처: 5. Data Structures — Python 공식 튜토리얼

목록(list)이 제공하는 메서드

목록은 배열처럼 쓰이면서도 스스로 크기를 조절하는 객체예요. 자주 쓰는 메서드를 정리하면 다음과 같아요.

  • append(x) — 목록 끝에 항목 하나를 추가해요. a[len(a):] = [x]와 같은 효과예요.
  • extend(iterable) — 반복 가능한 객체의 항목들을 통째로 이어 붙여요.
  • insert(i, x) — 지정한 위치 i 앞에 항목을 넣어요. a.insert(0, x)는 맨 앞에, a.insert(len(a), x)append(x)와 같아요.
  • remove(x) — 값이 x와 같은 첫 항목을 제거해요. 없으면 ValueError가 발생해요.
  • pop([i]) — 위치 i의 항목을 꺼내면서 제거하고 그 값을 돌려줘요. 인덱스를 주지 않으면 마지막 항목을 꺼내요.
  • clear() — 모든 항목을 비워요. del a[:]와 같아요.
  • index(x[, start[, stop]]) — 값 x가 처음 나타나는 위치를 돌려줘요. 없으면 ValueError예요.
  • count(x) — 값 x가 목록에 몇 번 나오는지 세요.
  • sort(*, key=None, reverse=False) — 항목을 제자리에서 정렬해요.
  • reverse() — 항목의 순서를 제자리에서 뒤집어요.
  • copy() — 얕은 복사본을 돌려줘요. a[:]와 같아요.

목록을 스택과 큐로 쓰기

목록은 마지막에 넣은 항목을 꺼내는 LIFO 구조(스택)에 딱 맞아요. 끝에 추가하는 append와 끝에서 꺼내는 pop이 모두 O(1)이라, 아래처럼 그냥 스택처럼 쓸 수 있어요.

stack = [3, 4, 5]
stack.append(6)
stack.pop()   # 6

반대로 맨 앞에서 넣고 빼는 FIFO 구조(큐)는 목록으로 하면 pop(0)처럼 앞쪽 연산이 느려요. 이때는 collections.deque를 쓰는 게 더 낫답니다.

튜플(tuple)

튜플은 목록과 비슷하지만 불변(immutable) 이에요. 생성 후에는 항목을 바꿀 수 없기 때문에, 값이 섞이거나 변하면 안 되는 데이터를 담을 때 써요.

t = 12345, 54321, 'hello!'
t[0]        # 12345
# t[0] = 88888  -> TypeError: 'tuple' object does not support item assignment

튜플 자체는 못 바꿔도 그 안에 목록 같은 가변 객체를 담는 건 가능해요. 괄호 없이 쉼표만으로도 튜플이 만들어지고, 한 항목짜리 튜플은 (x,)처럼 쉼표를 남겨야 한다는 점만 기억하면 돼요.

집합(set)

집합은 순서가 없고 중복을 허용하지 않는 컬렉션이에요. 어떤 값이 이미 있는지 확인하거나 중복을 제거할 때 유용하고, 합집합·교집합·차집합 같은 수학 연산도 지원해요.

basket = {'apple', 'orange', 'apple'}
len(basket)          # 2 — 중복은 하나로
'orange' in basket   # True

딕셔너리(dict)

딕셔너리는 키와 값을 짝지어 저장하는 컬렉션이에요. 전화번호부처럼 '이름 → 번호' 관계를 표현할 때 딱 맞아요.

tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
tel['jack']          # 4098
# tel['irv']         -> KeyError
tel.get('irv', 0)    # 0 — 키가 없어도 기본값

순서를 보장하며, for key in d로 키를 돌면서 d[key]로 값을 읽을 수 있어요. dict() 생성자는 키-값 쌍의 시퀀스로도 딕셔너리를 만들 수 있어요. 파이썬 3.7부터 딕셔너리는 삽입 순서가 유지된다는 점도 참고할게요.

더 알아보기