메서드 | 설명 |
setdefault(키, 기본값) | 딕셔너리에 키-값 쌍을 추가, 키만 지정하면 값에 None을 저장 |
update(키=값) | 딕셔너리에서 키의 값을 수정, 딕셔너리에 키가 없으면 키-값 쌍을 추가 |
update(딕셔너리) | |
update(리스트) | |
update(튜플) | |
update(반복가능한객체) | |
pop(키) | 딕셔너리에서 특정 키-값 쌍을 삭제한 뒤 값을 반환, del 딕셔너리[키]와 같음 |
pop(키, 기본값) | 기본값을 지정하면 키가 없을 때 기본 값을 반환 |
popitem() | 딕셔너리에서 임의의 키-값 쌍을 삭제하고 해당 키-값 쌍을 튜플로 반환 |
clear() | 딕셔너리의 모든 키-값 쌍을 삭제 |
get(키) | 딕셔너리에서 특정 키의 값을 가져옴 |
get(키, 기본값) | 기본값을 지정하면 키가 없을 때 기본값을 반환 |
items() | items는 딕셔너리의 키-값 쌍을 모두 가져옴 |
keys() | keys는 딕셔너리의 키를 모두 가져옴 |
values() | values는 딕셔너리의 값을 모두 가져옴 |
copy() | 딕셔너리를 복사하여 새 딕셔너리 생성 |
dict.fromkeys(키리스트) | 리스트(튜플)로 딕셔너리를 만듦, 키 리스트만 지정하면 값은 모두 None이 저장됨 |
dict.fromkeys(키리스트, 값) | 키 리스트와 값을 지정하면 해당 값이 딕셔너리의 값으로 저장됨 |
1. 딕셔너리 조작하기
1) 딕셔너리에 키-값 쌍 추가, 수정하기
- setdefault(키), setdefault(키, 값) : 새로운 키-값 쌍 추가 (수정 불가)
- update: 키의 값 수정, 키가 없으면 키-값 쌍 추가
setdefault(키)는 값에 None을 저장합니다.
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.setdefault('e')
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None}
setdefault(키, 값)처럼 키와 값을 지정하면 값에 값을 저장한 뒤 해당 값을 반환합니다.
>>> x.setdefault('f', 100)
100
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None, 'f': 100}
update는 키가 존재하면 수정, 없으면 새로운 키 추가
키가 문자열일 때만 사용 : update(키=값)
키가 숫자일 때 사용 : update(반복가능한객체) / update(딕셔너리), update(리스트), update(튜플), update(zip객체)
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.update(a=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)
>>> 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'}
>>> y.update(zip([1, 2], ['one', 'two']))
>>> y
{1: 'one', 2: 'two', 3: 'THREE', 4: 'FOUR'}
setdefault는 키-값 쌍 추가만 할 수 있고, 이미 들어있는 키의 값은 수정할 수 없습니다. 하지만 update는 키-값 쌍 추가와 값 수정이 모두 가능합니다. 다음과 같이 setdefault로 이미 들어있는 키 'a'를 90으로 저장해도 'a'의 값은 바뀌지 않습니다.
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.setdefault('a', 90)
10
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40}
## 딕셔너리는 + 연산자로 더할 수 없지만 update 메서드를 사용하면 +로 더한 것과 같은 효과를 낼 수 있습니다. 즉, update에 딕셔너리를 넣을 수 있고 키가 없으면 키를 추가하는 특성을 이용한 것입니다.
>>> x = {'a': 1, 'b': 2}
>>> y = {'c': 3, 'd': 4}
>>> x.update(y)
>>> x
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
## 파이썬 3.5 이상부터는 딕셔너리 언패킹을 이용한 병합을 지원합니다.
- {**딕셔너리, **딕셔너리}
>>> {**x, **y}
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
2) 딕셔너리에서 키-값 쌍 삭제하기
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']
>>> x
{'c': 30, 'd': 40}
popitem()은 딕셔너리에서 임의의 마지막 키-값 쌍을 삭제한 뒤 삭제한 키-값 쌍을 튜플로 반환합니다.( 파이썬 3.6 이상 )
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.popitem()
('d', 40)
>>> x
{'a': 10, 'b': 20, 'c': 30}
clear()는 딕셔너리의 모든 키-값 쌍을 삭제합니다.
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.clear()
>>> x
{}
3) 딕셔너리에서 키의 값을 가져오기
get(키)는 딕셔너리에서 특정 키의 값을 가져옵니다. 다음은 딕셔너리 x에서 키 'a'의 값을 가져옵니다.
get(키, 기본값)처럼 기본값을 지정하면 딕셔너리에 키가 있을 때는 해당 키의 값을 반환하지만 키가 없을 때는 기본값을 반환합니다.
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.get('a')
10
>>> x.get('z', 0)
0
딕셔너리에서 키-값 쌍을 모두 가져오기
- 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])
이 메서드들은 보통 for 반복문과 조합해서 사용하는데 자세한 내용은 뒤에서 설명하겠습니다.
4) 리스트와 튜플로 딕셔너리 만들기
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}
5) 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는 없는 키에 접근하더라도 에러가 발생하지 않으며 기본값을 반환합니다.
defaultdict는 collections 모듈에 들어있으며 기본값 생성 함수를 넣습니다.
defaultdict(기본값생성함수)
다음은 기본값이 0인 defaultdict 딕셔너리를 만듭니다.
>>> from collections import defaultdict # collections 모듈에서 defaultdict를 가져옴
>>> y = defaultdict(int) # int로 기본값 생성
>>> y['z']
0
defaultdict(int)처럼 int를 넣었는데 기본값이 왜 0인지 의문이 생길 수도 있습니다. int는 실수나 문자열을 정수로 변환하지만, 다음과 같이 int에 아무것도 넣지 않고 호출하면 0을 반환합니다.
>>> int()
0
defaultdict에는 특정 값을 반환하는 함수를 넣어주면 되는데, 0이 아닌 다른 값을 기본값으로 설정하고 싶다면 다음과 같이 기본값 생성 함수를 만들어서 넣어주면 됩니다.
>>> z = defaultdict(lambda: 'python')
>>> z['a']
'python'
>>> z[0]
'python'
2. 반복문으로 딕셔너리의 키-값 쌍을 모두 출력하기
for i in x:처럼 for 반복문에 딕셔너리를 지정한 뒤에 print로 변수 i를 출력해보면 값은 출력되지 않고 키만 출력됩니다.
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> for i in x:
... print(i, end=' ')
...
a b c d
키와 값을 모두 출력하려면 어떻게 해야 할까요? 이때는 for in 뒤에 딕셔너리를 지정하고 items를 사용해야 합니다.
for 키, 값 in 딕셔너리.items():
반복할 코드
>>> 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
딕셔너리의 키만 출력하기
지금까지 items로 키와 값을 함께 가져왔는데, 키만 가져오거나 값만 가져오면서 반복할 수도 있습니다.
- items: 키-값 쌍을 모두 가져옴
- keys: 키를 모두 가져옴
- values: 값을 모두 가져옴
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> for key in x.keys():
... print(key, end=' ')
...
a b c d
딕셔너리의 값만 출력하기
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> for value in x.values():
... print(value, end=' ')
...
10 20 30 40
3. 딕셔너리 표현식 사용하기
리스트와 마찬가지로 딕셔너리도 for 반복문과 if 조건문을 사용하여 딕셔너리를 생성할 수 있습니다. 다음과 같이 딕셔너리 안에 키와 값, for 반복문을 지정하면 됩니다.
- {키: 값 for 키, 값 in 딕셔너리}
- dict(키: 값 for 키, 값 in 딕셔너리)
>>> 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}
x = {key: value for key, value in dict.fromkeys(keys).items()}
>>> {value: key for key, value in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.items()} # 키-값 자리를 바꿈
{10: 'a', 20: 'b', 30: 'c', 40: 'd'}
딕셔너리 표현식에서 if 조건문 사용하기
for 반복문으로 반복하면서 del로 삭제하는 방식을 떠올릴 수 있습니다.
dict_del_by_value_error.py
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
for key, value in x.items():
if value == 20: # 값이 20이면
del x[key] # 키-값 쌍 삭제
print(x)
실행 결과
Traceback (most recent call last):
File "C:\project\dict_del_by_value_error.py", line 3, in <module>
for key, value in x.items():
RuntimeError: dictionary changed size during iteration
이때는 딕셔너리 표현식에서 if 조건문을 사용하여 삭제할 값을 제외하면 됩니다.
딕셔너리 표현식에서 if value != 20과 같이 if 조건문을 지정하면 값이 20이 아닌 키-값 쌍으로 다시 딕셔너리를 만듭니다. 직접 키-값 쌍을 삭제하는 방식이 아니라 삭제할 키-값 쌍을 제외하고 남은 키-값 쌍으로 딕셔너리를 새로 만드는 것이죠.
- {키: 값 for 키, 값 in 딕셔너리 if 조건식}
- dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
>>> 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}
4. 딕셔너리 안에서 딕셔너리 사용하기
- 딕셔너리 = {키1: {키A: 값A}, 키2: {키B: 값B}}
dict_dict.py
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
실행 결과
6051.8
딕셔너리 terrestrial_planet에 키 'Mercury', 'Venus', 'Earth', 'Mars'가 들어있고, 이 키들은 다시 값 부분에 딕셔너리를 가지고 있습니다. 즉, 중첩 딕셔너리는 계층형 데이터를 저장할 때 유용합니다.
딕셔너리 안에 들어있는 딕셔너리에 접근하려면 딕셔너리 뒤에 [ ](대괄호)를 단계만큼 붙이고 키를 지정해주면 됩니다.
- 딕셔너리[키][키]
- 딕셔너리[키][키] = 값
여기서는 딕셔너리가 두 단계로 구성되어 있으므로 대괄호를 두 번 사용합니다. 그래서 금성(Venus)의 반지름(mean radius)를 출력하려면 다음과 같이 먼저 'Venus'를 찾아가고 다시 'mean_radius'의 값을 가져오면 됩니다.
print(terrestrial_planet['Venus']['mean_radius']) # 6051.8
5. 딕셔너리의 할당과 복사
>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x
>>> x is y
True
>>> y['a'] = 99
>>> x
{'a': 99, 'b': 0, 'c': 0, 'd': 0}
>>> y
{'a': 99, 'b': 0, 'c': 0, 'd': 0}
딕셔너리 x와 y를 완전히 두 개로 만들려면 copy 메서드로 모든 키-값 쌍을 복사해야 합니다.
>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x.copy()
>>> x is y
False
>>> x == y
True
>>> y['a'] = 99
>>> x
{'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y
{'a': 99, 'b': 0, 'c': 0, 'd': 0}
중첩 딕셔너리의 할당과 복사 알아보기
>>> x = {'a': {'python': '2.7'}, 'b': {'python': '3.6'}}
>>> y = x.copy()
>>> y['a']['python'] = '2.7.15'
>>> x
{'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}
>>> y
{'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}
중첩 딕셔너리를 완전히 복사하려면 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'}}
[ 연습문제 ]
표준 입력으로 문자열 여러 개와 숫자 여러 개가 두 줄로 입력되고, 첫 번째 줄은 키, 두 번째 줄은 값으로 하여 딕셔너리를 생성합니다. 다음 코드를 완성하여 딕셔너리에서 키가 'delta'인 키-값 쌍과 값이 30인 키-값 쌍을 삭제하도록 만드세요.
keys = input().split()
values = map(int, input().split())
x = dict(zip(keys, values))
x={key:value for key,value in x.items() if key != 'delta' and value != 30}
print(x)
10 20 30 40
{'alpha': 10, 'bravo': 20}
30 40 50 60 70 80 90
{'bravo': 40, 'charlie': 50, 'echo': 70, 'foxtrot': 80, 'golf': 90}
'BASIC' 카테고리의 다른 글
파일 다루기 (2) | 2023.11.28 |
---|---|
set (0) | 2023.11.27 |
문자열 포매팅 (1) | 2023.11.25 |
문자열 method (1) | 2023.11.25 |
2차원 리스트의 할당과 복사 알아보기 (1) | 2023.11.25 |
댓글