[Py린이를 위한 Python 기초] 6. 딕셔너리 응용
※ 이 글은 책 「파이썬 코딩도장」의 내용을 재정리한 내용임
- 파이썬 시리즈 글 순서-> 링크
1) 딕셔너리 다시 정리
● 딕셔너리란?
- 키와 값의 쌍으로 이루어진 객체
- 형태는 {키1: 값1, 키2: 값2, 키3: 값3...}
a = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
print(a)
print(type(a))
# {'a': 10, 'b': 20, 'c': 30, 'd': 40}
# <class 'dict'>
- 딕셔너리 키에 접근 (딕셔너리[키])
a = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
print(a['b'])
# 20
- 딕셔너리의 키에 값 할당 (딕셔너리[키] = 값)
a = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
a['b'] = 1000
print(a)
# {'a': 10, 'b': 1000, 'c': 30, 'd': 40}
- 딕셔너리에 값이 있는지 확인
a = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
print('a' in a)
print('e' not in a)
# True
# True
- 딕셔너리 키 개수 구하기 ( len(딕셔너리))
a = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
print(len(a))
# 4
2) 딕셔너리 메소드
- 여기서는 편의상 딕셔너리 d = {a:10, b:20, c:30}을 선언하고 관련 메소드를 알아보자
- 리스트와 마찬가지로 표로 정리해보았다
메소드 | 설명 | 예시 | |
추가 | d.setdefault('키') | 키-값(None) 쌍 추가 | d = {'a':10, 'b':20, 'c':30} d.setdefault('e') print(d) # {'a':10, 'b':20, 'c':30, 'e': None} |
추가 및 수정 |
d.setdefault('키', 값) | 키- 값 쌍 추가 | d = {'a':10, 'b':20, 'c':30} d.setdefault('e', 40) print(d) # {'a':10, 'b':20, 'c':30, 'e': 40} |
d.update('키'=값) | 해당 키에 대한 값 수정 | d = {'a':10, 'b':20, 'c':30} d.update(c=50) print(d) # {'a':10, 'b':20, 'c': 50} |
|
d.update('없는 키'=값) | 키가 없으므로 키-값 쌍 추가 | d = {'a':10, 'b':20, 'c':30} d.update(e=50) print(d) # {'a':10, 'b':20, 'c': 30, 'e': 50} |
|
d.update(딕셔너리) | 키가 있으면 키에 대한 값 수정 키가 없으면 키-값 쌍 추가 |
d = {'a':10, 'b':20, 'c':30} d.update({'a': 100, 'e': 50}) print(d) # {'a':100, 'b':20, 'c': 30, 'e': 50} |
|
d.update(리스트or 튜플) | [[키1, 값1], [키2, 값2]] ((키1, 값1),(키2, 값2)) 으로 반영키 있으면 값 수정, 키 없으면 키-값 쌍 추가 |
d = {'a':10, 'b':20, 'c':30} d.update([[a, 100],[e, 50]]) print(d) # {'a':100, 'b':20, 'c': 30, 'e': 50} |
|
d.update(반복가능한객체) | 키-값 쌍으로 된 반복가능한 객체로 값 수정 | d = {'a':10, 'b':20, 'c':30} d.update(zip(['e', 'f'], [50, 60])) print(d) # {'a':10, 'b':20, 'c':30, 'e':50, 'f':60} |
|
삭제 | d.pop('키') | 키에 해당하는 키-값 쌍 삭제 후 삭제값 반환 | d = {'a':10, 'b':20, 'c':30} d.pop('a') # 10 |
d.pop('키', 기본값) | 키 있음-> 해당 키-값 쌍 삭제 키 없음-> 기본값 반환 |
d = {'a':10, 'b':20, 'c':30} d.pop('e', 0) # 0 |
|
del d['키'] | 해당 키-값 쌍 삭제 | d = {'a':10, 'b':20, 'c':30} del d['a'] print(d) # {'b':20, 'c':30} |
|
d.popitem() | 임의의 키-값 쌍 삭제 후 튜플로 반환 | d = {'a':10, 'b':20, 'c':30} print(d.popitem()) print(d) # ('a', 10) # {'b':20, 'c':30} |
|
d.clear() | 모든 키-값 쌍 삭제 후 빈 딕셔너리가 됨 | d = {'a':10, 'b':20, 'c':30} d.clear() print(d) # { } |
|
추출 | d.get('키') | 키에 해당하는 값 가져옴 | d = {'a':10, 'b':20, 'c':30} d.get('a') # 10 |
d.get('키', 기본값) | 키에 해당하는 값 가져옴 키가 없으면 기본값 반환 |
d = {'a':10, 'b':20, 'c':30} d.get('e', 0) # 0 |
|
d.items() | 키-값 쌍을 모두 가져옴 | d = {'a':10, 'b':20, 'c':30} d.items() # dict_items([('a', 10), ('b', 20), ('c', 30)]) |
|
d.keys() | 키를 모두 가져옴 | d = {'a':10, 'b':20, 'c':30} d.keys() # dict_keys(['a', 'b', 'c']) |
|
d.values() | 값을 모두 가져옴 | d = {'a':10, 'b':20, 'c':30} d.values() # dict_values([10, 20, 30]) |
|
리스트 (튜플)로 딕셔너리 만들기 |
dict.fromkeys(리스트) | 리스트로 키를 생성, 값은 모두 None으로 저장함 | keys = [ 'a', 'b', 'c'] d = dict.fromkeys(keys) print(d) # {'a': None, 'b': None, 'c': None} |
dict.formkeys(리스트, 값1) | 리스트로 키를 생성, 값은 모두 값1로 저장함 | keys = [ 'a', 'b', 'c'] d = dict.fromkeys(keys, 100) print(d) # {'a': 100, 'b': 100, 'c': 100} |
|
복사 | copy(딕셔너리) | 딕셔너리의 모든 키-값 쌍 복사 (값이 같은 서로 다른 객체 생성) |
d = {'a':10, 'b':20, 'c':30} e = copy(d) print(e) print(d == e) print(d is e) # {'a':10, 'b':20, 'c':30} # True # False |
import copy copy.deepcopy(딕셔너리) |
중첩 딕셔너리의 모든 키-값 쌍 복사 (값이 같은 서로 다른 객체 생성) |
import copy d = {'a':{'aa':10}, 'b':{'bb': 20}, 'c':{'cc': 30}} e = copy.deepcopy(d) print(e) print(d == e) print(d is e) # {'a':10, 'b':20, 'c':30} # True # False |
3) 반복문으로 키-값 쌍 출력하기
- 그냥 반복문을 쓰면
d = {'a': 10, 'b':20, 'c':30}
for i in d:
print(i)
# a
# b
# c
- 키값만 출력이 된다.
- for문에 그대로 넣을 수 있는 건 시퀀스객체(문자열, 리스트, 튜플)이며 딕셔너리는 시퀀스 객체에 해당하지 않음
- 그럼 어떻게 해야할까?
- items()를 활용한 방법
d = {'a': 10, 'b':20, 'c':30}
for i, j in d.items():
print(i, j)
# a 10
# b 20
# c 30
- keys()를 활용한 방법
d = {'a': 10, 'b':20, 'c':30}
for i in d.keys():
print(i, d[i])
# a 10
# b 20
# c 30
4) 딕셔너리 표현식 사용하기
● for 반복문을 사용하여 딕셔너리를 생성
- 기본 형태는 아래와 같다
{키: 값 for 키, 값 in 딕셔너리}
dict({키: 값 for 키, 값 in 딕셔너리})
- 무슨말인지 모르겠다면 예시를 보자
keys = ['a', 'b', 'c', 'd'] #키리스트 작성
d = {key: value for key, value in dict.fromkeys(keys).items()}
print(d)
# {'a': None, 'b': None, 'c': None, 'd': None}
- d = {key: value for key, value in dict.fromkeys(keys).items()} 에서
- 1단계: d = {key: value for key, value in dict.fromkeys(keys).items()}
=> 색칠된 부분을 출력하면 dict_items([('a', None), ('b', None), ('c', None), ('d', None)])
- 2단계: d = {key: value for key, value in dict.fromkeys(keys).items()}
=> for 반복문으로 key와 값을 하나씩 꺼내어
- 3단계: d = {key: value for key, value in dict.fromkeys(keys).items()} 순으로 계산이 됨
=> key: value 형태로 저장하여 딕셔너리를 만든다.
- d = {key: value for key, value in dict.fromkeys(keys).items()} 이 식이 1단계 dict.fromkeys(keys).items() 식과 다를게 뭔가? 오히려 더 복잡해졌다.
- 딕셔너리 표현식은 딕셔너리 자체를 만드는 것보다는 있는 딕셔너리를 편집할 때 유용하게 쓰임
- 키만 가져오고 값은 모두 동일하게 넣는 방법
keys = ['a', 'b', 'c', 'd'] #키리스트 작성
d = {key: 10 for key in dict.fromkeys(keys).items()}
print(d)
# {'a': 10, 'b': 10, 'c': 10, 'd': 10}
- 값을 키로 사용하는 방법
d = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
e = {value: 0 for value in d.values()}
# {10: 0, 20: 0, 30: 0, 40: 0}
- 키와 값의 자리를 바꾸는 방법
d = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
e = {value: key for key, value in d.items()}
print(e)
# {10: 'a', 20: 'b', 30: 'c', 40: 'd'}
● if 조건문 사용하기
- 딕셔너리에서 특정값을 찾아 키-값 쌍을 삭제하고 싶다. for 반복문을 써보자
d = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
#값이 20이면 키-값 쌍 삭제
for key, value in d.items():
if value == 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
- 에러가 발생한다. 도중에 딕셔너리 크기가 바뀌었기 때문이다. 그러므로 이 방법은 쓸 수 없음
- 이때 딕셔너리 표현식을 쓸 수 있다.
- 기본형태
{키: 값 for 키, 값 in 딕셔너리 if 조건식}
dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
- 예시를 보자
d = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
d = {key: value for key, value in d.items() if value != 20} #20이 아닌 키-값쌍을 딕셔너리에 저장
print(x)
# {'a': 10, 'c': 30, 'd': 40}
5) 중첩 딕셔너리
● 중첩 딕셔너리란?
- 딕셔너리 안에 딕셔너리를 사용하는 것
- 형태
딕셔너리 = {키1: {키a: 값a}, 키2: {키b: 값b}}
- 예시를 보자
# 게임 캐릭터에 대한 정보를 표시해보자
LeagueOfLegends = {
'Garen':{
'HP': 500
'mana': 0
'ATK': 66
'DEF': 36
},
'Viego':{
'HP': 630
'mana': 0
'ATK': 57
'DEF': 34
},
'LeBlanc':{
'HP':598
'mana': 400
'ATK': 54
'DEF': 21
},
'Caitlyn':{
'HP': 580
'mana': 313
'ATK': 62
'DEF': 28
},
'Thresh':{
'HP': 530
'mana': 273
'ATK': 56
'DEF': 28
},
}
- 케이틀린 캐릭터의 공격력을 보고싶을 땐 어떻게 해야할까?
- LeagueOfLegends['Caitlyn']['ATK']을 출력하면 62라는 값이 나온다.
- 그렇다면 쓰레쉬의 체력을 600으로 바꾸고 싶으면 어떻게 해야할까?
- LeagueOfLegends['Thersh']['HP'] = 600 으로 할당해주면 된다.
- 여기까지 딕셔너리를 알아보았다
- 리스트랑 비슷한 구성으로 소제목을 짜보았는데 전달이 잘 됐을지 모르겠다
- 아무튼 6편 끝