본문 바로가기
Python 코딩도장

파이썬 코딩도장 Unit 25 정리(1) - 딕셔너리 조작

by chanfficial 2022. 2. 1.

Unit 25

딕셔너리 응용하기

 

 

1. 딕셔너리 조작하기

 

1-1. 딕셔너리에 키-값 쌍 추가하기

  • 딕셔너리에 키-값 쌍을 추가하는 메서드는 두 가지가 있다.
    1. setdefault : 키-값 쌍 추가
    2. update : 키의 값 수정, 키가 없으면 키-값 쌍 추가

 

1-2. 딕셔너리에 키와 기본값 저장하기

  • setdefault(키) 는 딕셔너리에 키-값 쌍을 추가한다.
  • setdefault에 키만 지정하면 값에 None을 저장한다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.setdefault('e') # 키 e를 추가하고 값은 None
    >>> x
    {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None}​
  • setdefault(키, 기본값) 처럼 키와 기본값을 지정하면 값에 기본값을 저장한 뒤 해당 값을 반환한다.
    # 키 f를 추가하고 값에 100을 지정한 뒤, 100을 반환
    >>> x.setdefault('f', 100)
    100
    >>> x
    {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None, 'f': 100}​

1-3. 딕셔너리에서 키의 값 수정하기

  • update(키=값) 은 이름 그대로 딕셔너리에서 키의 값을 수정한다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.update(a=90) # 키의 값을 90으로 수정
    >>> x
    {'a': 90, 'b': 20, 'c': 30, 'd': 40}​
  • 만약 딕셔너리에 키가 없으면 키-값 쌍을 추가한다.
    >>> x.update(e=50) # 딕셔너리에 키-값 쌍 추가
    >>> x
    {'a': 90, 'b': 20, 'c': 30, 'd': 40, 'e': 50}​
  • update는 키-값 쌍 여러 개를 콤마로 구분해서 넣어주면 값을 한꺼번에 수정할 수 있다.
  • 이때도 키가 있으면 해당 키의 값을 수정하고 없으면 키-값 쌍을 추가한다.
    >>> x.update(a=900, f=60) # a값 수정, f값 추가
    >>> x
    {'a': 900, 'b': 20, 'c': 30, 'd': 40, 'e': 50, 'f': 60}​
  • update(키=값) 은 키가 문자열일 때만 사용할 수 있고, 만약 키가 숫자일 경우에는 update(딕셔너리) 처럼 딕셔너리를 넣어서 값을 수정할 수 있다.
    >>> y = {1: 'one', 2: 'two'}
    >>> y.update({1: 'ONE', 3: 'THREE'})
    >>> y
    {1: 'ONE', 2: 'two', 3: 'THREE'}​
  • update(리스트), update(튜플) 처럼 리스트와 튜플을 이용하여 값을 수정하는 방법도 있다.
  • 여기서 리스트는 [[키1, 값1], [키2, 값2]] 형식으로 키와 값을 리스트로 만들고 이 리스트를 다시 리스트 안에 넣어서 키-값 쌍을 나열해 준다.(튜플도 마찬가지)
    >>> 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'}​
     
  •  

※ setdefault와 update의 차이

  • setdefault는 키-값 쌍 추가만 할 수 있고, 이미 들어있는 키의 값은 수정할 수 없다.
  • update는 키-값 쌍 추가와 값 수정이 모두 가능하다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.setdefault('a', 90) # 이미 들어있는 a의 값은 수정 불가
    10
    >>> x
    {'a': 10, 'b': 20, 'c': 30, 'd': 40}​

 

1-4. 딕셔너리에서 키-값 쌍 삭제하기

  • pop(키) 는 딕셔너리에서 특정 키-값 쌍을 삭제한 뒤 삭제한 값을 반환한다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.pop('a') # 딕셔너리 x에서 키 a를 삭제한 뒤 10을 반환
    10
    >>> x
    {'b': 20, 'c': 30, 'd': 40}​
  • pop(키, 기본값) 처럼 기본값을 지정하면 딕셔너리에 키가 있을 때는 해당 키-값 쌍을 삭제한 뒤 삭제한 값을 반환하지만 키가 없을 때는 기본값만 반환한다.
    >>> x.pop('z', 0)
    0 # 딕셔너리 x에는 z키가 없으므로 기본값 반환
  • pop 대신 del 로 특정 키-값 쌍을 삭제할 수도 있으며 이때는 [ ]에 키를 지정하여 del을 사용한다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> del x['a'] # 딕셔너리 x의 키 a를 삭제함
    >>> x
    {'b': 20, 'c': 30, 'd': 40}​

1-5. 딕셔너리에서 임의의 키-값 쌍 삭제하기

  • popitem() 은 딕셔너리에서 임의의 키-값 쌍을 삭제한 뒤 삭제한 키-값 쌍을 튜플로 반환한다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.popitem() 
    ('d', 40) # 딕셔너리 x에서 d:40을 삭제함
    >>> x
    {'a': 10, 'b': 20, 'c': 30}​

1-6. 딕셔너리의 모든 키-값 쌍을 삭제하기

  • clear() 는 딕셔너리의 모든 키-값 쌍을 삭제하며, 딕셔너리의 모든 키-값 쌍을 삭제하면 빈 딕셔너리 { }가 된다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.clear()
    >>> x
    {} # 모든 키-값 쌍을 삭제하여 빈 딕셔너리가 됨​

1-7. 딕셔너리에서 키의 값을 가져오기

  • get(키) 는 딕셔너리에서 특정 키의 값을 가져온다.
    >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
    >>> x.get('a')
    10​
  • get(키, 기본값) 처럼 기본값을 지정하면 딕셔너리에 키가 있을 때는 해당 키의 값을 반환하지만 키가 없을 때는 기본값을 반환한다.
    >>> x.get('z', 0)
    0​

 

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

  • 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-9. 리스트와 튜플로 딕셔너리 만들기

  • 먼저 keys = ['a', 'b', 'c', 'd'] 처럼 키가 들어있는 리스트를 준비한다.(튜플도 가능)
  • dict.fromkeys(키리스트) 는 키 리스트로 딕셔너리를 생성하며 값은 모두 None으로 저장한다.
    >>> keys = ['a', 'b', 'c', 'd'] # 리스트 생성
    >>> x = dict.fromkeys(keys) # 키 리스트로 딕셔너리 생성
    >>> x
    {'a': None, 'b': None, 'c': None, 'd': None}​
  • dict.fromkeys(키리스트, 값) 처럼 키 리스트와 값을 지정하면 해당 값이 키의 값으로 저장된다.
    >>> y = dict.fromkeys(keys, 100)
    >>> y
    {'a': 100, 'b': 100, 'c': 100, 'd': 100}​

※ defaultdict 사용하기

  • 지금까지 사용한 딕셔너리(dict)는 없는 키에 접근했을 경우 에러가 발생했다.
    >>> 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 모듈에 들어있으며 기본값 생성 함수를 넣는다.
    # 기본값이 0인 defaultdict 딕셔너리 생성
    >>> from collections import defaultdict # collections 모듈에서 defaultdict를 가져옴
    >>> y = defaultdict(int)    # int로 기본값 생성​
  • 이때 딕셔너리 y에는 키 'z'가 없지만 y['z']와 같이 키의 값을 가져와보면 0이 나오는데, 이는 기본값을 0으로 설정했기 때문이다.
    >>> y['z']
    0​
  • defaultdict(int) 처럼 int를 넣었는데 기본값이 0이 나오는 것은, int는 실수나 문자열을 정수로 변환하지만 다음과 같이 int에 아무것도 넣지 않고 호출하면 0을 반환하기 때문이다.
    >>> int()
    0​
  • defaultdict에는 특정 값을 반환하는 함수를 넣어주면 되는데, defaultdict(int)는 기본값 생성 함수로 int를 지정하여 0이 나오도록 만든 것이다.
  • 0이 아닌 다른 값을 기본값으로 설정하고 싶다면 다음과 같이 기본값 생성 함수를 만들어 넣어주면 된다.
    >>> z = defaultdict(lambda: 'python')
    >>> z['a']
    'python'
    >>> z[0]
    'python'​
  • 여기서는 문자열 'python'을 반환하는 lambda: 'python'을 넣어서 'python'이 기본값이 되도록 설정했다.