Tips/Python

[Py린이를 위한 Python 기초] 6. 딕셔너리 응용

엘사박 2023. 2. 28. 14:31

※ 이 글은 책 「파이썬 코딩도장」의 내용을 재정리한 내용임

- 파이썬 시리즈 글 순서->  링크

 

 

 

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편 끝