파이썬의 기본 컬렉션은 리스트·튜플·딕셔너리·셋 네 가지다. 가장 중요한 구분은 변경 가능 여부(mutable·immutable)와 순서·중복을 어떻게 다루는가다.
| list | tuple | dict | set | |
|---|---|---|---|---|
| 문법 | [1, 2] | (1, 2) | {"a": 1} | {1, 2} |
| 변경 | 가능 | 불가 | 가능 | 가능 |
| 순서 | 유지 | 유지 | 삽입 순서 유지(3.7+) | 없음 |
| 중복 | 허용 | 허용 | 키는 유일 | 불허 |
| 접근 | 인덱스 | 인덱스 | 키 | 포함 여부 |
튜플을 쓰는 이유
- 값이 바뀌지 않아야 할 묶음(좌표, 함수의 여러 반환값)을 표현한다. 여기저기 넘겨도 누가 고칠 걱정이 없다
- 해시할 수 있어(hashable, 요소도 불변일 때) 딕셔너리 키나 셋 원소가 될 수 있다
dict.items(), 여러 값 반환처럼 언어가 자연스럽게 튜플을 쓴다
딕셔너리와 셋은 해시 테이블(hash table)
- 키는 해시할 수 있어야 한다. 그래서 리스트는 키가 될 수 없고 튜플·문자열·숫자는 된다
- 조회·삽입·포함 검사가 평균 O(1)이다(해시 테이블, 빅오 표기법). 리스트의
in은 O(n)이라, 큰 목록에서 포함 여부를 반복 검사하면 셋으로 바꾼다 - 파이썬 3.7부터 딕셔너리는 삽입 순서를 보장한다. "딕셔너리는 순서가 없다"는 오래된 설명이다
unique = list(dict.fromkeys(items)) # 순서를 지키며 중복 제거
a & b, a | b, a - b # 셋 교집합·합집합·차집합
pairs = dict(zip(keys, values))
counts = collections.Counter(words) # 빈도 세기참과 거짓
False, None, 0, 0.0, 빈 문자열 "", 빈 컬렉션([], (), {}, set())은 조건문에서 거짓으로 평가된다. if items:로 비어 있는지 검사하는 것이 관용적이지만, None과 빈 값을 구분해야 할 때는 is None으로 비교한다.
그 밖에
collections의deque(양쪽 끝 O(1)),defaultdict,Counter,namedtuple을 알아 두면 직접 짤 코드가 준다(큐, 빈도수 세기 패턴)- 리스트를 복사할 때 얕은 복사와 깊은 복사의 차이는 얕은 복사와 깊은 복사를 본다
- 문자열도 불변 시퀀스라 인덱싱·슬라이싱이 같고, 원시 문자열(raw string)
r"\d+"는 역슬래시를 그대로 둔다(정규 표현식 기초)