Dictionary
Dictionary
- 딕셔너리는 Key와 Value라는 것을 한 쌍으로 갖는 자료형
- 흔히 Map 이라고도 불리우는데, 키(Key)로 신속하게 값(Value)을 찾아내는 해시테이블(Hash Table) 구조임
- 리스트나 튜플처럼 순차적으로(sequential) 해당 요소값을 구하지 않고 Key를 통해 Value를 얻음
읽기, 추가, 수정, 삭제
# 생성
phoneBook = {'Aaron' : 5556069,
'Bill' : 5559824,
'Dad' : 5552603}
phoneBook['Dad'] # Read
phoneBook['Mom'] = 5551111 # Append
phoneBook['Dad'] = 5551111 # Overwrite
phoneBook['Dad'] = (5552603, 5551111)
del phoneBook['Bill'] # Delete
딕셔너리 값 출력
키는 랜덤하게 리턴되는데, 이는 해시테이블의 속성임
for key in phoneBook: val = phoneBook[key] print("%s : %d" % (key, val))
Tuple 사용 예
def caller_id(lookup_number): for name, num in phoneBook.items(): if num == lookup_number: return name # reverse-lookup Dad's number print(caller_id(5551111))
다른 Dictionary 생성 방법
Tuple List로부터 dict 생성
persons = [('김기수', 30), ('홍대길', 35), ('강찬수', 25)] mydict = dict(persons) age = mydict["홍대길"] print(age) # 35
Key=Value 파라미터로부터 dict 생성
scores = dict(a=80, b=90, c=85) print(scores['b']) #90
Key, Value, Item
- dict.keys() : Dictionary의 키값들로 된 dict_keys 객체를 리턴
- dict.values() : Dictionary의 값들로 된 dict_values 객체를 리턴
items() : Dictonary의 키-값 쌍 Tuple 들로 구성된 dict_items 객체를 리턴
Key 리스트 만들기(keys)
a.keys()는 딕셔너리 a의 Key만을 모아서 dict_keys라는 객체를 리턴
>>> a = {'name': 'pey', 'phone': '0119993323', 'birth': '1118'} >>> a.keys() dict_keys(['name', 'phone', 'birth'])
dict_keys 객체는 리스트를 사용하는 것과 차이가 없지만, 리스트 고유의 함수인 append, insert, pop, remove, sort등의 함수를 수행할 수는 없다.
dict_keys 객체를 리스트로 변환하려면 다음과 같이 하면 된다.
>>> list(a.keys()) ['phone', 'birth', 'name']
- [파이썬 3.0 이후 버전의 keys 함수, 어떻게 달라졌나?]
- 파이썬 2.7 버전까지는 a.keys() 호출 시 리턴값으로 dict_keys가 아닌 리스트를 리턴한다. 리스트를 리턴하기 위해서는 메모리의 낭비가 발생하는데 파이썬 3.0 이후 버전에서는 이러한 메모리 낭비를 줄이기 위해 dict_keys라는 객체를 리턴해 준다. 다음에 소개할 dict_values, dict_items 역시 파이썬 3.0 이후 버전에서 추가된 것들이다. 만약 3.0 이후 버전에서 리턴값으로 리스트가 필요한 경우에는 "list(a.keys())"를 사용하면 된다. dict_keys, dict_values, dict_items 등은 리스트로 변환하지 않더라도 기본적인 반복성(iterate) 구문(예: for문)들을 실행할 수 있다.
scores = {"철수": 90, "민수": 85, "영희": 80}
# keys
keys = scores.keys()
for k in keys:
print(k)
# values
values = scores.values()
for v in values:
print(v)
items = scores.items()
print(items)
# 출력: dict_items([('민수', 85), ('영희', 80), ('철수', 90)])
# dict_items를 리스트로 변환할 때
itemsList = list(items)
dict.get()
scores = {"철수": 90, "민수": 85, "영희": 80}
v = scores.get("민수") # 85
v = scores.get("길동") # None
v = scores.get("길동", 0) # '길동'에 해당하는 값이 없으므로 디폴트 값인 0을 리턴
v = scores["길동"] # 에러 발생
# 멤버쉽연산자 in 사용
if "길동" in scores:
print(scores["길동"])
scores.clear() # 모두 삭제
print(scores)
dict.update()
- Dictionary 안의 여러 데이타를 한꺼번에 갱신하는데 유용
- update() 안에 Dictionary 형태로 여러 데이타의 값을 변경하면, 해당 데이타들이 update() 메서드에 의해 한꺼번에 수정됨
persons = [('김기수', 30), ('홍대길', 35), ('강찬수', 25)]
mydict = dict(persons)
mydict.update({'홍대길':33,'강찬수':26})
dict.clear()
- clear() 함수는 딕셔너리 안의 모든 요소를 삭제
- 빈 리스트 [ ], 빈 튜플 (), 빈 딕셔너리 { }로 표현
>>> a.clear() >>> a {}
Dictionary 주의 사항
중복키 사용 금지 (어떤 것이 무시될지는 예측할 수 없음)
>>> a = {1:'a', 1:'b'} >>> a {1: 'b'}
Key에 리스트는 쓸 수 없음 (튜플은 immutable이기 때문에 가능)
>>> a = {[1,2] : 'hi'} Traceback (most recent call last): File "", line 1, in ? TypeError: unhashable type