본문 바로가기
TIL/Python | Django

2021.5.7 TIL : [Python] 기초 문법5- 딕셔너리(1)

by yeon_zoo 2021. 5. 7.

Unit 25. 딕셔너리 응용하기

1. 키-값 쌍 추가하기

setdefault(키) 는 딕셔너리에 키-값 쌍을 추가한다. setdefault에 키만 저장하면 값에는 자동으로 none을 저장한다. setdefault(키, 기본값)을 지정하면 값에 기본값을 저장한 뒤 해당 값을 반환한다. 

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

2.. 키-값 쌍 수정하기

만약 어떤 키의 값을 수정하고 싶다면 update메서드를 사용할 수 있다. 

syntax : x.update(키=값)

키가 존재하지 않는다면 자동으로 키와 값 쌍을 추가해준다. 

여러 쌍을 콤마로 구분하면 한 번에 수정이 가능하다. 이때도 키가 있으면 해당 키의 값을 수정하고, 없으면 키-값 쌍을 추가한다. 

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.update(a=90)
>>> x.update(e=50)
>>> x.update(c=100, f=3000)
>>> x
{'a': 90, 'b': 20, 'c': 100, 'd': 40, 'e':50, 'f':3000}

update(키=값) 은 키가 문자열일 때만 사용 가능하다. 만약 키가 숫자일 경우에는 update(딕셔너리)처럼 딕셔너리를 넣어서 값을 수정할 수 있다. 혹은 리스트와 튜플을 이용할 수도 있다. 이 때 리스트는 [[키1, 값1], [키2, 값2]] 형식으로 키와 값을 리스트로 만들고 이 리스트를 다시 리스트 안에 넣어서 키-값 쌍을 나열해준다. (튜플도 같은 형식)

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

특히 update(반복가능한 객체)는 키-값 쌍으로 된 반복 가능한 객체로 값을 수정한다. 즉, 다음과 같이 키 리스트와 값 리스트를 묶은 zip객체로 값을 수정할 수 있다. 

3. 키-값 쌍 삭제하기

pop(키)는 딕셔너리에서 특정 키-값 쌍을 삭제한 뒤 삭제한 값을 반환한다. 만약 pop(키, 기본값)처럼 기본값을 지정하면 딕셔너리에 키가 있을 때는 해당 키-값 쌍을 삭제한 뒤 삭제한 값을 반환하지만 키가 없을 때는 기본값만 반환한다. 

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

pop 대신 del로 특정 키-값 쌍을 삭제할 수도 있다. 이때는  []에 키를 지정하여 del을 사용한다. 다음은 딕셔너리 x의 키 'a'를 삭제한다. 

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

혹은 마지막 키-값 쌍을 삭제하고 싶다면, popitem()을 사용 할 수 있다. 이 때 삭제한 키-값 쌍을 튜플 형으로 반환하게 된다. 

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

모든 키-값 쌍을 삭제하는 것은 리스트와 동일하게 x.clear()를 이용하면 된다.

 

4. 딕셔너리에서 키-값 쌍을 가져오기

get(키)는 딕셔너리에서 특정 키의 값을 가져온다. 다음은 딕셔너리 x에서 키 'a'의 값을 가져온다. get(키, 기본값)처럼 기본값을 지정하면 딕셔너리에 키가 있을 때는 해당 키의 값을 반환하지만 키가 없을 때는 기본값을 반환합니다.

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

5. 딕셔너리에서 키-값 쌍을 모두 가져오기

딕셔너리는 키와 값을 가져오는 다양한 메서드를 제공한다.

  • items: 키-값 쌍을 모두 가져옴
  • keys: 키를 모두 가져옴
  • values: 값을 모두 가져옴
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.items()
dict_items([('a', 10), ('b', 20), ('c', 30), ('d', 40)])

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

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

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

keys = ['a', 'b', 'c', 'd']처럼 키가 들어있는 리스트가 있다. 이 때 dict.fromkeys에 키가 들어있는 리스트를 넣으면 딕셔너리를 생성한다. 

dict.fromkeys(키리스트)는 키 리스트로 딕셔너리를 생성하며 값은 모두 None으로 저장한다.

dict.fromkeys(키리스트, 값)처럼 키 리스트와 값을 지정하면 해당 값이 모든 키의 값으로 저장된다.

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

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

※참고defaultdict 사용하기

지금까지 배운 딕셔너리는 없는 키에 접근했을 경우 에러가 발생한다.

>>> 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 모듈에 있으며 기본값 생성 함수를 넣는다.

defaultdict(기본값생성함수)

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

>>> int()
0

이 때 y 딕셔너리에는 키 'z'가 없지만 y['z']와 같이 키의 값을 가져와 보면 0이 나온다. int에 아무것도 넣지 않고 호출하면 0을 반환한다. defaultdict에는 특정 값을 반환하는 함수를 넣어주면 되는데, defaultdict(int)는 기본값 생성 함수로 int를 지정하여 0이 나오도록 만든 것이다. 

0이 아닌 다른 값을 기본값으로 설정하고 싶다면 다음과 같이 기본값 생성 함수를 만들어서 넣어주면 된다.

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

문자열 'python'을 반환하는 lambda: 'python'을 넣어서 'python'이 기본값이 되도록 설정했다. 이 후 lambda에 대해 다시 정리할 예정이다. 

 

출처: [코딩도장 파이썬] dojang.io/mod/page/view.php?id=2307

댓글