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
    

results matching ""

    No results matching ""