Unit 25
딕셔너리 응용하기
1. 딕셔너리 조작하기
1-1. 딕셔너리에 키-값 쌍 추가하기
- 딕셔너리에 키-값 쌍을 추가하는 메서드는 두 가지가 있다.
- setdefault : 키-값 쌍 추가
- 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'이 기본값이 되도록 설정했다.
'Python 코딩도장' 카테고리의 다른 글
파이썬 코딩도장 Unit 25 정리(3) - 딕셔너리 표현식 사용 (0) | 2022.02.03 |
---|---|
파이썬 코딩도장 Unit 25 정리(2) - 반복문으로 딕셔너리의 키-값 쌍을 모두 출력 (0) | 2022.02.02 |
파이썬 코딩도장 Unit 24 정리(2) - 문자열 서식 지정자, 포매팅 사용 (0) | 2022.01.29 |
파이썬 코딩도장 Unit 24 정리(1) - 문자열 조작 (0) | 2022.01.28 |
파이썬 코딩도장 Unit 23 정리(4) - 2차원 리스트의 할당과 복사 (0) | 2022.01.27 |