개발/Python

튜플을 딕셔너리 키 값으로 사용할 수 있을까?

센솔 2024. 3. 10. 18:56
my_dict = dict()
my_dict[(0,0)] = 1

 

딕셔너리인데 키 값이 튜플이다.

이 경우 문제 없이 실행될까?

 

결론부터 말하면, 된다!

 

키(key) 값(value)
10 "민수"
20 "상호"
30 "수현"

 

딕셔너리는 키-값 쌍으로 이루어진 자료형이다. 

파이썬에 내장된 딕셔너리는 '해시 테이블' (Hash table) 구조로 구현되어 있다. 

 

해시 테이블을 논리적으로 표현하면 다음과 같은 모양이다.

  # Logical model of Python Hash table
  -+-----------------+
  0| <hash|key|value>|
  -+-----------------+
  1|      ...        |
  -+-----------------+
  .|      ...        |
  -+-----------------+
  i|      ...        |
  -+-----------------+
  .|      ...        |
  -+-----------------+
  n|      ...        |
  -+-----------------+

0~n으로 표시된 인덱스는 편의상 표기한 것으로, 실제로 저장되는 값은 아니다.

 

<해시, 키, 값> 형태의 데이터가 연속적으로 메모리에 저장되는 구조다.

 

(참고)

더보기

파이썬 딕셔너리를 구현한 C 코드의 일부의 모습이다.

<해시, 키, 값> 을 저장할 수 있는 구조체 형태다.

typedef struct {
    /* Cached hash code of me_key. */
    Py_hash_t me_hash;
    PyObject *me_key;
    PyObject *me_value;
} PyDictEntry;

 

'키'와 '값'은 평소에도 딕셔너리를 사용할 때 많이 쓰기 때문에 익숙한 개념이다.

 

딕셔너리를 저장할 때 해시는 왜 필요한 것일까?

해시는 '빠른 데이터 탐색' 을 위해 필요하다. 딕셔너리에 값을 저장할 때 키 값은 고유한 '해시' 로 변환되는데, 이 해시는 탐색 시 인덱스로 활용되어 O(1) 의 속도로 값을 찾아낼 수 있도록 한다.

 

비유하자면, 수 백개의 방문이 있는 호텔에서 내가 어떤 주문(키)을 외치면 그 주문에 맞는 열쇠(해시)가 만들어져 단숨에 방 문 앞으로 보내준다고 생각할 수 있겠다.

 

이때, 키를 해시로 만드는 데에는 해시함수가 사용된다.

이 해시 함수는 아주 예민해서, 키 값이 조금이라도 달라지면 완전히 다른 해시 값을 내놓는다. (눈사태 효과)

느낌표 하나만 추가되었을 뿐인데 해시 값은 완전히 달라졌다

 

딕셔너리에서 키 값이 조금이라도 달라진다면, 해시 또한 완전히 달라져버릴 것이다.

그렇게 되면 해시를 통해 값에 접근할 수 없게 된다.

 

따라서 딕셔너리에 사용되는 키는 불변하며 일관성이 있어야 한다.

딕셔너리에 사용될 수 있는 키를 해시 사용성(Hashability)이 있다고 한다.

 

튜플은 변하지 않는다. 즉, 튜플은 hashable 하다. 

딕셔너리의 키로 변수 또는 리스트가 사용될 수 없는 것과 대조적이다.

 


 

결론적으로, 파이썬에서 튜플은 딕셔너리의 키로 사용할 수 있다.

my_dict[(0,0)] = True .. 와 같은 형태가 가능하다는 말인데,

(x, y) 튜플을 만들어 키로 사용하면 좌표에 대한 값을 매핑할 때 유용할 수 있을 것 같다.