뮤트 개발일지

[파이썬 코딩 도장] Unit 25. 딕셔너리 응용하기 본문

코딩도장

[파이썬 코딩 도장] Unit 25. 딕셔너리 응용하기

박뮤트 2021. 12. 29. 23:53

딕셔너리 조작하기

setdefault(키, 기본 값): 키와 값을 추가한다.

>>> x.setdefault('f', 100)
100
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None, 'f': 100}

* 기본 값을 설정하지 않으면 none 으로 추가된다.

update(): 키의 값 수정 및 추가(기존에 키가 없다면)한다. 콤마로 여러 개 수정 가능하다. update(키 = 값)은 키가 문자열이때만 가능하고, 키가 숫자인 경우에는 딕셔너리 형태로 넣어서 값을 추가할 수 있다.

>>> x.update(a=900, f=60)
>>> x
{'a': 900, 'b': 20, 'c': 30, 'd': 40, 'e': 50, 'f': 60}
>>> y = {1: 'one', 2: 'two'}
>>> y.update({1: 'ONE', 3: 'THREE'})
>>> y
{1: 'ONE', 2: 'two', 3: 'THREE'}

리스트와 튜플을 이용해서도 수정할 수 있다. 위의 예제에 리스트를 이용해 키, 값을 추가하면,

>>> y.update([[2, 'TWO'], [4, 'FOUR']])
>>> y
{1: 'ONE', 2: 'TWO', 3: 'THREE', 4: 'FOUR'}

가 된다. 그리고 또한 update(반복 가능한 객체)로 값을 수정할 수 있다. (아래 예시는 zip객체를 이용)

>>> y.update(zip([1, 2], ['one', 'two']))
>>> y
{1: 'one', 2: 'two', 3: 'THREE', 4: 'FOUR'}

pop(키): 특정 키, 값을 삭제한 후 반환

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.pop('a')
10
>>> x
{'b': 20, 'c': 30, 'd': 40}

이 때, pop(키)에서 키가 존재하지 않는다면, 기본값을 반환한다.

>>> x.pop('z', 0)
0

del 로도 삭제 가능

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> del x['a']
>>> x
{'b': 20, 'c': 30, 'd': 40}

popitem(): 특정 키, 값을 삭제한 후 튜플로 반환

* 파이썬 3.6 이상에서는 마지막 키-값을 삭제 / 3.5 이하에서는 임의의 키-값 삭제

# 파이썬 3.6 이상
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.popitem()
('d', 40)
>>> x
{'a': 10, 'b': 20, 'c': 30}
# 파이썬 3.5 이하에서는 매번 삭제하는 키-값이 달라진다.
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.popitem()    
('a', 10)
>>> x
{'b': 20, 'c': 30, 'd': 40}

clear(): 모든 키-값을 삭제

 

get(키): 키의 값을 가져온다. 해당 키가 없을 경우에는 지정한 기본값을 반환한다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.get('a')
10
>>> x.get('z', 0)
0

items(): 딕셔너리의 모든 키-값을 가져온다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.items()
dict_items([('a', 10), ('b', 20), ('c', 30), ('d', 40)])

keys(): 모든 키 값을 가져온다.

>>> x.keys()
dict_keys(['a', 'b', 'c', 'd'])

values(): 모든 값을 가져온다.

>>> x.values()
dict_values([10, 20, 30, 40])

리스트와 튜플로 딕셔너리 만들기

1. 키가 들어있는 리스트(또는 튜플)를 만든다.

2. dict.fromkeys(키 리스트, 값)으로 딕셔너리를 생성한다. 이 때, 값을 설정하지 않으면 모두 None으로 저장된다.

>>> y = dict.fromkeys(keys, 100)
>>> y
{'a': 100, 'b': 100, 'c': 100, 'd': 100}

딕셔너리는 키의 값이 존재하지 않으면 아래와 같이 오류가 발생한다. 

>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> x['z']    # 키 'z'는 없음
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    x['z']
KeyError: 'z'

defaultdict은 없는 키에 접근하더라도 에러가 발생하지 않으며 기본값을 반환한다.

defaultdict은 collections 모듈에 있다.

>>> from collections import defaultdict    # collections 모듈에서 defaultdict를 가져옴
>>> y = defaultdict(int)                   # int로 기본값 생성

 

이 때, 없는 키의 값을 가져오면 0이 나온다. 0이 아닌 다른 수로 나오게 하고 싶으면 다음과 같이 기본값 생성 함수를 만들어 넣는다.

>>> z = defaultdict(lambda: 'python')
>>> z['a']
'python'
>>> z[0]
'python'

반복문으로 딕셔너리 키-값 쌍을 모두 출력하기

for key, valut in x.items(): 딕셔너리 x에서 키-값 쌍을 꺼내서 키는 key에, 값은 value에 저장하고 코드를 반복한다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> for key, value in x.items():
...     print(key, value)
...
a 10
b 20
c 30
d 40

* key()를 사용하면 키만, values()를 사용하면 값만 가져올 수 있다.


딕셔너리 표현식 사용하기

딕셔너리도 for 반복문과 if 조건문을 이용하여 딕셔너리 생성이 가능하다. 

for 반복문

>>> keys = ['a', 'b', 'c', 'd']
>>> x = {key: value for key, value in dict.fromkeys(keys).items()}
>>> x
{'a': None, 'b': None, 'c': None, 'd': None}

if 조건문

딕셔너리는 특정 키를 삭제하는 pop 매소드만 제공, 특정 값을 삭제하는 매소드는 제공하지 않는다.

따라서 반복문과 조건문으로 삭제한다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x = {key: value for key, value in x.items() if value != 20}
>>> x
{'a': 10, 'c': 30, 'd': 40}

(만약 20과 같지 않은 수라면 키와 값을 가져온다는 뜻)


딕셔너리 안에서 딕셔너리 사용하기

딕셔너리 안에 딕셔너리에 접근하기 위해서는 [][] 형태로 대괄호를 두 번 사용한다.

terrestrial_planet = {
    'Mercury': {
        'mean_radius': 2439.7,
        'mass': 3.3022E+23,
        'orbital_period': 87.969
    },
    'Venus': {
        'mean_radius': 6051.8,
        'mass': 4.8676E+24,
        'orbital_period': 224.70069,
    },
    'Earth': {
        'mean_radius': 6371.0,
        'mass': 5.97219E+24,
        'orbital_period': 365.25641,
    },
    'Mars': {
        'mean_radius': 3389.5,
        'mass': 6.4185E+23,
        'orbital_period': 686.9600,
    }
}
 
print(terrestrial_planet['Venus']['mean_radius'])    # 6051.8

딕셔너리 할당과 복사

>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x

x와 y는 서로 같은 메모리를 할당하게 된다. 따라서, 하나의 변수에서 값을 바꾸더라도 다른 변수 역시 바뀌게 된다. 

이를 완전히 분리하여 복사하고 싶은 경우, copy 매소드로 완전히 키-값 쌍을 복사해야 한다.

중첩 딕셔너리의 경우에는 copy 매소드가 아닌 copy 모듈의 deepcopy 함수를 사용해야 완전히 복사할 수 있다.

>>> x = {'a': {'python': '2.7'}, 'b': {'python': '3.6'}}

>>> import copy             # copy 모듈을 가져옴

>>> y = copy.deepcopy(x)    # copy.deepcopy 함수를 사용하여 깊은 복사
>>> y['a']['python'] = '2.7.15'
>>> x
{'a': {'python': '2.7'}, 'b': {'python': '3.6'}}
>>> y
{'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}