Python 강좌 / 딕셔너리로 키와 값 관리하기
딕셔너리는 키를 사용해 값을 찾는 자료형입니다. 필드 이름으로 기록을 표현하거나 분류별 합계를 만들 때 유용하며, 없는 키를 오류로 처리할지 기본값으로 처리할지 정해야 합니다.
키·값과 중복 키의 규칙
딕셔너리는 중괄호 안에 키: 값 쌍을 적습니다. 같은 키에 다시 대입하면 새 항목이 늘어나는 대신 값이 교체됩니다. 키는 해시 가능한 값이어야 하므로 문자열이나 정수는 보통 사용할 수 있지만 리스트는 사용할 수 없습니다. 문자열 키는 대소문자와 앞뒤 공백을 구분합니다.
관련 동작과 지원 조건은 Python: stdtypes에서 확인할 수 있습니다.
expense = {"name": "lunch", "amount": 8000}
expense["amount"] = 9000
print(expense["amount"])
삽입 순서는 유지되지만 금액순·이름순으로 자동 정렬되는 것은 아닙니다. 정렬된 결과가 필요하면 기준을 명시합니다.
공유 객체와 키별 집계은 변수의 범위와 변경 가능한 객체의 동작 이해하기 및 collections·itertools로 집계와 반복 처리하기에서 사용하는 규칙과 연결됩니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python dicts.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
dicts.py 파일의 전체 내용입니다.
expenses = [("food", 8000), ("transport", 2500), ("food", 3500)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
for category, total in sorted(totals.items()):
print(category, total)
print(totals.get("books", 0))
예상 결과는 다음과 같습니다.
food 11500
transport 2500
0
대괄호 접근과 get 구분하기
totals["books"]는 키가 없으면 KeyError를 발생시킵니다. get("books", 0)은 없을 때 0을 반환하고 실제 딕셔너리에 books를 추가하지는 않습니다. 필수 필드가 빠진 데이터를 0으로 조용히 바꾸면 오류를 숨길 수 있으므로 필수 여부를 먼저 판단합니다.
for key in totals는 키를 반복합니다. 값만 필요하면 values(), 키와 값 모두 필요하면 items()를 사용합니다. dict 복사도 기본적으로 얕은 복사라서 내부 리스트가 있으면 공유될 수 있습니다.
해시 가능하다는 것은 수명 동안 바뀌지 않는 해시값을 제공하고, 같은 값으로 비교되는 객체끼리 같은 해시값을 갖는다는 뜻입니다. dict의 키와 set의 원소에는 이런 조건이 필요합니다. 리스트는 키로 쓸 수 없고, 튜플도 내부에 리스트가 있으면 해시 가능하지 않습니다. 딕셔너리로 합계를 구할 때 키가 없으면 0부터 시작하는 패턴이 반복된다면 defaultdict(int)를 검토할 수 있습니다.
이 동작과 적용 조건의 공식 설명: Python glossary: hashable
집계 데이터 검증과 변경 실험
- food 금액 하나를 3500에서 4500으로 바꿔 food 합계만 12500이 되는지 확인합니다.
- Food처럼 대문자로 바꿔 별도 키가 생기는지 확인합니다. 입력을 정규화할지 정책을 정합니다.
- books를 필수 분류로 간주한다면 get 기본값으로 숨기지 말고 키 존재 여부를 검사합니다.
키를 추가하거나 삭제하면서 같은 딕셔너리를 순회하면 RuntimeError가 발생할 수 있습니다. 먼저 대상 키를 따로 모으거나 새 딕셔너리로 결과를 만듭니다.




