노트

파이썬 기본 컬렉션

Python Built-in Collections

CS#python · 연결된 개념 6개

쉽게 말하면

파이썬 기본 컬렉션은 쓰임이 다른 수납 도구 네 가지예요. 순서대로 쌓는 서랍, 봉인한 상자, 이름표 붙은 칸, 같은 건 하나만 들어가는 바구니처럼, 바꿀 수 있는지와 순서·중복을 보고 골라요.

비유가 깨지는 곳 dict가 순서 없는 칸이라는 건 옛 설명이에요. 3.7부터 삽입 순서를 보장해요. dict와 set은 해시 테이블이라 키가 해시 가능해야 해서, 리스트는 키가 못 되고 튜플은 돼요.

파이썬의 기본 컬렉션은 리스트·튜플·딕셔너리·셋 네 가지다. 가장 중요한 구분은 변경 가능 여부(mutable·immutable)와 순서·중복을 어떻게 다루는가다.

listtupledictset
문법[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+"는 역슬래시를 그대로 둔다(정규 표현식 기초)

출처: Python 튜토리얼: Data Structures · Sets · Dictionaries

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 가변 기본 인자 함정

    파이썬 함수의 기본값은 함수를 정의할 때 한 번 평가되어 그 객체가 계속 재사용된다. 그래서 리스트·딕셔너리 같은 변경 가능한 객체를 기본값으로 쓰면, 호출할 때마다 같은 객체가 공유되어 값이 쌓인다.

  • 파이썬 클래스 기초

    파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.

  • 파이썬의 선 (PEP 20)

    팀 피터스가 정리한 파이썬 설계 철학 19줄. 명시성, 단순함, 가독성을 앞세운다.

  • 기본형 집착

    전화번호·금액·우선순위 같은 도메인 개념을 끝까지 문자열이나 숫자로만 다루는 냄새. 같은 검증과 포맷 코드가 여기저기 반복되고, 문자열로 모든 걸 표현하는 "stringly typed" 코드가 된다.

  • 파이썬 모듈과 패키지

    파이썬에서 .py 파일 하나가 모듈(module)이고, 모듈을 모은 디렉터리가 패키지(package)다. import는 다른 모듈의 변수·함수·클래스에 접근할 수 있게 해 주고, 모듈은 처음 import될 때 한 번만 실행된 뒤 캐시된다(sys.modules).

보기 옵션