[Python] 딕셔너리(dictionary)

반응형
    반응형

     

    파이썬에서 자주 사용되는 자료구조로 리스트, 튜플, 딕셔너리(dictionary)가 있습니다. dictionary는 '사전'이라는 뜻을 가지고 있습니다. 우리가 사전을 사용하는 이유는 단어의 뜻을 모를 때 사용하는데 사전에서 찾고자 하는 단어의 뜻을 찾기 위해서 단어로 사전에서 찾고 뜻을 알아냅니다. 즉, 단어와 뜻이 쌍으로 정리했기 때문에 우리가 단어만 가지고 뜻을 알아낼 수 있는 것입니다. 이와 유사하게 파이썬의 딕셔너리도 키(key)와 값(value)이라는 것을 쌍으로 저장해서 저장된 값을 찾을 수 있게 만든 구조입니다. 

     

    리스트는 [] 를 사용했고 튜플은 ()을 사용했습니다. 딕셔너리는 {}를 사용합니다. 딕셔너리는 리스트와 튜플과는 확실히 다릅니다. 예를 들면, 만약 주식 종목의 현재가를 저장하는 프로그램을 만든다고 하면, '삼성전자'를 넣으면 현재가가 나와야 합니다. 리스트와 튜플로는 '삼성전자'를 넣으면 현재가가 나오게 하는 게 쉽지가 않습니다. 왜냐하면 리스트와 튜플은 값을 하나씩 저장을 했기 때문입니다. 더구나, '종목 - 현재가'와 같이 연관된 두 개의 데이터를 저장하지는 못합니다.  이런 구조를 표현하기 위해서는 딕셔너리가 제격입니다.

     

    지금의 예를 계속 끌고 가보겠습니다. 

    price = {}

    현재가를 넣는 딕셔너리를 'price' 라고 하겠습니다. 

    삼성전자를 한번 넣어보겠습니다. 현재 삼성전자의 현재가는 48, 300원이라 하면 다음과 같이 넣습니다.

    price['삼성전자'] = 48300

    좋은 점이기도 하고 주의할 점이기도 한 것은 딕셔너리는 한 개의 key 에 한 개의 value 만 넣을 수 있습니다.

    지금 삼성전자의 현재가는 48300 인데 다시 40000 원으로 넣으면 기존의 데이터가 사라지고 

    삼성전자 - 40000 으로 바뀌게 됩니다. 지금까지 한 것의 결과를 보겠습니다.

    price={}
    price['삼성전자'] = 48300
    print(price)
    price['삼성전자'] = 40000
    print(price)


    이번엔 업데이트를 해보겠습니다. 현재가는 매일 변하면 매번 바꿔줘야 하는데 이미 만든 딕셔너리로 한 번에 업데이트를 할 수 있습니다. 바로 update() 함수를 쓰면 되는데요. 두 딕셔너리를 병합하는 기능을 가지고 있습니다. 더하여, 겹치는 키가 있으면 업데이트하는 딕셔너리의 값을 덮어써서 값을 변경합니다.

    이번엔 카카오를 넣고 삼성전자의 현재가를 갱신하겠습니다. 

    price ={'삼성전자': 48300}
    b = {'카카오' : 152500, '삼성전자': 50000}
    price.update(b)
    print(price)

    price 에는 삼성전자 : 48300 으로 되어있는데 b라는 딕셔너리로 카카오를 신규로 만들고 갱신하려고 합니다. 

    그래서 price.update(b)를 썼습니다. () 안에 들어있는 b로 price의 value값이 b의 value 값으로 변경되는 것을 볼 수 있습니다.


    딕셔너리의 key 를 삭제하기 위해서는 어떻게 해야 할까요? 

    del 키워드pop() 함수를 쓰면 됩니다.

    pop()은 앞서 리스트에 대해서 포스팅 했었는데 값을 반환하고 해당 자료구조에서 삭제하는 함수입니다.

    먼저 pop() 보겠습니다. 우리가 만든 price에서 카카오를 삭제하려고 합니다. 먼저 값을 다른데 넣어놓고 하기 위해 pop을 씁니다.

    price = {'삼성전자': 50000, '카카오': 152500}
    x = price.pop('카카오')
    print(x)
    print(price)

    x로 카카오의 현재가를 반환하고 price에서 삭제했습니다. 보시면 아시겠지만 pop으로 반환할 때 value 값이 나옴을 알 수 있습니다. value 값을 넣으면 key 값이 나오겠구나 생각하실 수도 있는데 입력을 해보면 에러가 뜹니다. pop 은 key 값을 대입했을 때에만 작동합니다. 

     

    del로 똑같이 카카오를 제거하겠습니다.

    price = {'삼성전자': 50000, '카카오': 152500}
    del price['카카오']
    print(price)

    아주 간단합니다. del 옆에 해당 key 값을 넣으면 되겠습니다. 

     

     

    딕셔너리의 모든 값을 초기화하고 싶다면 clear() 함수를 씁니다.

    price = { '삼성전자': 48300, '카카오' : 152500}
    price.clear()
    print(price)


    딕셔너리에서도 in 키워드를 사용할 수 있습니다. 다만, 따로 지정을 하지 않는다면 key값에 의해서만 작동합니다.

    value 값에서 in키워드를 사용하고 싶다면, dict.values()라고 명시를 해줘야 합니다.

    price = { '삼성전자': 48300, '카카오' : 152500}
    print('삼성전자' in price)
    print(48300 in price)
    print(48300 in price.values())

    48300 in price 에서는 False 가 나오지만 48300 in price.values()에서는 True 가 나오는 것을 확인할 수 있습니다. 

     

    딕셔너리의 특성상 in 키워드는 리스트와 튜플과는 다르게 속도의 우위에 있습니다. 리스트와 튜플은 값을 중복해서 넣을 수 있습니다. 1000개의 값이 있는 리스트 안에 100이라는 숫자가 있는지 확인하려고 합니다. 100 in list를 하면 리스트에 모든 값 1000개에 대해 검사를 합니다. 그렇지만 딕셔너리는 key 값이 중복이 불가능해서 key 값 하나를 찾고 True, False를 판정하면 그만이니 딕셔너리의 크기가 아무리 크다 하더라도 in 키워드에 대한 연산속도가 일정합니다. 

     

    이번엔 value값을 직접 불러보겠습니다. 

    get() 함수나 dict[key] 를 사용해서 불러올 수 있습니다. 기능상 똑같은 기능을 합니다. 다만, key 값이 딕셔너리에 없을 경우 dict [key]는 에러가 발생하고 get()은 'None'으로 표시합니다. 에러가 발생하면 다음 코드 진행을 할 수가 없으니 반복문을 사용해 에러 예외처리를 하고 싶다면 get() 함수를 사용하는 것이 좋습니다.

    price = { '삼성전자': 48300, '카카오' : 152500}
    print(price.get('카카오'))
    print(price['카카오'])
    print(price.get('현대'))
    print(price['현대'])

    price ['현대']는 현재 price에 '현대'라는 key 값이 없으므로 에러가 뜨는 반면에 get 함수를 쓴 price.get('현대')는 None으로 처리하는 것을 볼 수 있습니다. 만약에 price ['현대']가 코드의 위쪽에 배치되면 에러 때문에 밑에 있는 모든 코드가 동작을 안 할 것입니다.

     

     

    모든 key 값과 values 값을 따로 정리하고 싶다면 dict.keys() , dict.values() 라고 설정하면 됩니다. 데이터로 다루고 싶다면 list로 변환해서 사용합니다. 딕셔너리의 key-value 쌍을 items() 함수를 이용해 리스트로 넘길 수도 있습니다. 일단 items() 사용하면 key-value 쌍이 튜플로 변환됩니다. 그 튜플을 리스트로 변환하면 되겠습니다.

    price = { '삼성전자': 48300, '카카오' : 152500}
    print(price.keys())
    print(type(price.keys()))
    print(list(price.values()))
    print(price.items())
    print(list(price.items()))

    price.keys()의 타입을 보면 dict_keys라고 되어있습니다. 이것으로는 데이터로 쓰기가 불편하니 리스트 형태로 변환해서 쓰는 게 좋습니다. 그래서 price.values()를 리스트로 변환했습니다. items를 사용해 key-value 쌍은 튜플이 되었고 리스트 형태로 변환해 튜플이 리스트 안에 들어간 것을 볼 수 있습니다.

    딕셔너리 하나 잘 정리하면 key 값과 value 값을 따로 뽑아쓰기 편하기 때문에 데이터를 다룰 때 좋습니다. 항시 딕셔너리 업데이트를 할 수 있기 때문에 딕셔너리와 리스트 변환을 자유롭게 할 수 있는 실력이 되면 큰 도움이 될 것입니다.

    조금이나마 도움이 되길 바라면서 이상으로 포스팅을 마치겠습니다.

     

    'Python > 기초' 카테고리의 다른 글

    [Python] while 반복문 쓰기  (0) 2020.04.02
    [Python] 조건문(if, elif, else)  (0) 2020.03.30
    [Python] 리스트 다루기(생성,추가,인덱싱)  (0) 2020.03.25
    [Python] 문자열(string) 다루기  (0) 2020.03.25
    [python] 변수 이해  (0) 2020.03.23

    댓글

    Designed by JB FACTORY

    ....