딕셔너리는 리스트와 비슷하지만 더 범용적으로 사용 할 수 있다. 리스느는 인덱스로 정수만 사용 할 수 있지만 딕셔너리는 거의 모든 타입을 인덱스로 사용 할 수 있다.
딕셔너리는 값을 저장하는(혹은 가리키는) 키의 조합이라고 생각하면 된다. 키(key)와 값(value)로 이루어져있기 때문에 key-value pair라고 부른다. 혹은 아이텀(item)이라고 부르기도 한다. 예를 들어 한영사전을 딕셔너리로 만든다고 하면 키는 영어 문자열 값은 한글 문자열이 된다.
내장 함수인 dict를 이용해서 아이템을 가지지 않은 빈 딕셔너리를 만들 수 있다.
리스트에도 in 연산자가 있는데, 딕셔너리와는 완전히 다른 알고리즘을 사용한다. 리스트의 경우 목록이 길어지면 검색 시간이 정비례해서 길어진다. 하지만 사전의 경우 해시 알고리즘을 사용하므로 사전에 아이템이 얼마가 있더라도 거의 동일한 시간에 원하는 아이템을 찾을 수 있다.
딕셔너리는 키를 이용해서 쉽게 값을 찾을 수 있다. 이 연산을 lookup이라고 부른다.
반대로 값을 이용해서 키를 찾으려면 어떻게 해야 할까. 여기에는 두가지 문제가 있다. 첫째 같은 값을 가지는 키가 두개 이상 있을 수 있다. 응용 프로그램에 따라서 처음 발견한 하나만 돌려주거나 키의 목록을 만들어야 할 수도 있다. 둘째, 값으로 조회하는 효과적인 알고리즘이 없다. 딕셔너리에 있는 모든 아이템을 전부 조회해야 한다.
아래 함수는 값을 가지고 있는 첫번째 키만 돌려준다.
루프를 통과 할 때마다 histogram 딕셔너리에서 키와 값을 가져온다. 이렇게 가져온 값을 키로 하는 inverse 딕셔너리를 만들고 여기에 키를 리스트로 append 한다. 이 과정을 상태 다이어그램(state digram)으로 묘사했다.
리스트는 딕셔너리의 값이 될 수는 있지만 키가 될 수는 없다. 아래 코드를 실행해보자.
딕셔너리는 키의 해시테이블을 유지한다고 했다. 따라서 키로 사용하려면 해시 테이블로 만들 수 있어야 한다. 키를 목록으로 사용한다고 가정해보자. 키가 불면이라면 올바르게 작동할 것이다. 그러나 목록의 경우 키를 변경 할 수 있는데, 그때 나쁜 일이 발생한다. 파이선은 키-값 쌍을 만들 때 해시를 하는데, 키가 수정되면 다른 해시 값을 가질 수 있다. 이 경우 동일한 키에 대해서 두개의 항목이 있거나 키를 찾지 못할 수도 있다.
리스트와 딕셔너리는 변경 할 수 있으므로 키로 사용 할 수 없다. 다만 값으로만 사용 할 수 있다.
Contents
1. Dictionaries
2. Dictionary as a set of counters
3. 딕셔너리와 루프
4. Reverse 루프
5. 딕셔너리와 리스트
6. Memos
7. 전역 변수
8. Long integers
1. Dictionaries
2. Dictionary as a set of counters
3. 딕셔너리와 루프
4. Reverse 루프
5. 딕셔너리와 리스트
6. Memos
7. 전역 변수
8. Long integers
Recent Posts
Archive Posts
Tags