2.9. 딕셔너리

딕셔너리(dictionary)키(key)값(value) 에 매핑한 것입니다. 각 키는 직접 조회되며, 딕셔너리는 그 키에 마지막으로 연결된 값이 무엇인지 기억합니다.

2.9.1. 딕셔너리 만들기

중괄호와 key: value 쌍을 사용하거나 dict 생성자를 사용하세요:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

값은 문자열, 숫자, 리스트, 심지어 다른 딕셔너리 등 어떤 타입이든 될 수 있습니다:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
두 개의 열로 표시된 딕셔너리: 왼쪽에는 키, 오른쪽에는 값이 있으며, 각 쌍을 화살표로 연결합니다.

딕셔너리의 각 키는 정확히 하나의 값에 매핑됩니다.

2.9.2. 접근과 멤버십

[] 로 인덱싱하면 키에 해당하는 값을 가져옵니다. 존재하지 않는 키는 KeyError 를 발생시킵니다:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

관대한 조회를 원한다면 dict.get() 을 사용하세요. 존재하지 않는 키에 대해 None 을 반환하거나, 두 번째 인자로 전달한 값을 반환합니다:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

in 키워드는 값이 아니라 의 멤버십을 검사합니다:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. 추가, 갱신, 제거

d[key] 에 할당하면 키가 새것이면 항목이 추가되고, 이미 존재하면 덮어씁니다:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

제거에는 몇 가지 형태가 있습니다:

  • del d[key] – 항목을 제거합니다. 키가 없으면 KeyError 를 발생시킵니다.

  • dict.pop() – 값을 제거하고 반환합니다. 선택적 기본값을 지정하면 예외를 피할 수 있습니다.

  • dict.clear() – 모든 항목을 제거합니다.

dict.update() 는 다른 딕셔너리(또는 (key, value) 쌍의 리스트)를 대상에 병합하며, 일치하는 키를 덮어씁니다:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. 반복

딕셔너리를 직접 반복하면 삽입 순서대로 키가 나옵니다:

for k in person:
    print(k)

세 가지 뷰가 명시적인 접근을 제공합니다:

  • dict.keys() – 키(딕셔너리를 반복하는 것과 동일).

  • dict.values() – 값.

  • dict.items()(key, value) 튜플로, 루프에서 언패킹하기에 안성맞춤입니다.

for key, value in person.items():
    print(key, "=", value)

2.9.5. 키가 될 수 있는 것

딕셔너리 키는 해시 가능(hashable) 해야 합니다. 즉 수명 동안 값이 변하지 않아야 합니다. 흔한 해시 가능 타입은 다음과 같습니다:

list, dict, bytearray 같은 가변 타입은 키가 될 수 없으며, 이를 사용하면 TypeError 가 발생합니다. 불변 값의 튜플은 2차원 격자 좌표 같은 복합 식별자로 딕셔너리에 키를 매기는 표준적인 방법입니다:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. 길이

len() 은 항목의 개수를 반환합니다:

>>> len(person)
4