4. 딕셔너리 안애 딕셔너리 사용하기(중첩 딕셔너리)
- 딕셔너리는 값 부분에 다시 딕셔너리가 계속 들어갈 수 있다.
딕셔너리 = {키1: {키A: 값A}, 키2: {키B: 값B}}
- 예를 들어 지구형 행성의 반지름, 질량, 공전주기를 중첩 딕셔너리로 표현해볼 수 있다.
- 딕셔너리 terrestrial_planet에 키 'Mercury', 'Venus', 'Earth', 'Mars' 가 들어있고, 이 키들은 다시 값 부분에 딕셔너리를 가지고 있다.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
- 즉, 중첩 딕셔너리는 계층형 데이터를 저장할 때 유용하다.
- 딕셔너리 안에 들어있는 딕셔너리에 접근하려면 딕셔너리 뒤에 [ ] 를 단계만큼 붙이고 키를 지정해주면 된다.
딕셔너리[키][키] 딕셔너리[키][키] = 값
- 위의 예제에서는 딕셔너리가 두 단계로 구성되어 있으므로 대괄호를 두 번 사용하며, 금성(Venus)의 반지름(mean radius)를 출력하려면 먼저 'Venus'를 찾아가고 다시 'mean_radius'의 값을 가져오면 된다.
print(terrestrial_planet['Venus']['mean_radius']) # 6051.8
5. 딕셔너리의 할당과 복사
- 리스트와 마찬가지로 딕셔너리도 할당과 복사는 큰 차이점이 있다. 먼저 딕셔너리를 만든 뒤 다른 뒤에 할당해보자
- y = x와 같이 딕셔너리를 다른 변수에 할당하면 딕셔너리가 두 개가 될 것 같지만 실제로는 하나이다.>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0} >>> y = x
- x와 y를 is 연산자로 비교해보면 True가 나오는데, 이를 통해 변수 이름만 다를 뿐 딕셔너리 x와 y는 같은 객체임을 알 수 있다.
>>> x is y True
- x와 y는 같으므로 y['a']=99와 같이 키 'a'의 값을 변경하면 딕셔너리 x와 y에 모두 반영된다.
>>> 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와 y를 is 연산자로 비교해보면 False가 나오고, 이를 통해 두 딕셔너리는 다른 객체임을 알 수 있다.
- 복사한 키-값 쌍은 같으므로 ==로 비교하면 True가 나온다.>>> x is y False >>> x == y True
- 딕셔너리 x와 y는 별개이므로 한쪽의 값을 변경해도 다른 딕셔너리 영향을 미치지 않는다.
- 다음과 같이 딕셔너리 y에서 키 'a'의 값을 변경하면 딕셔너리 x는 그대로이고 딕셔너리 y만 바뀝니다.>>> y['a'] = 99 >>> x {'a': 0, 'b': 0, 'c': 0, 'd': 0} >>> y {'a': 99, 'b': 0, 'c': 0, 'd': 0}
5-1. 중첩 딕셔너리의 할당과 복사 알아보기
- 중첩 딕셔너리를 생성한 후 copy 메서드로 복사해보자
>>> x = {'a': {'python': '2.7'}, 'b': {'python': '3.6'}} >>> y = x.copy()
- 이제 y['a']['python']='2.7.15'와 같이 y의 값을 변경해보면 x와 y에 모두 반영된다.
>>> 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 함수를 사용해야 한다.
- 이제 딕셔너리 y의 값을 변경해도 딕셔너리 x에는 영향을 미치지 않는다.>>> 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'}}
- copy.deepcopy 함수는 중첩된 딕셔너리에 들어있는 모든 딕셔너리를 복사하는 깊은 복사(deep copy)를 해준다.
'Python 코딩도장' 카테고리의 다른 글
파이썬 코딩도장 Unit 26 정리(2) - 집합 연산 (0) | 2022.02.08 |
---|---|
파이썬 코딩 도장 Unit 26 정리(1) - 세트 만들기 (0) | 2022.02.07 |
파이썬 코딩도장 Unit 25 정리(3) - 딕셔너리 표현식 사용 (0) | 2022.02.03 |
파이썬 코딩도장 Unit 25 정리(2) - 반복문으로 딕셔너리의 키-값 쌍을 모두 출력 (0) | 2022.02.02 |
파이썬 코딩도장 Unit 25 정리(1) - 딕셔너리 조작 (0) | 2022.02.01 |