딕셔너리는 해석하면 사전이다. 실제로 사전과 성격이 매우 유사하다.
딕셔너리는 [key : value]로 이뤄져 있다.
예를 들면 [토끼 : 설명어쩌구] [사슴 : 설명어쩌구] 이런 것들을 만들어서 담을 수 있다.
딕셔너리라는 것을 이용하면 사용자 입장에서 key를 입력하고 value를 전달받을 수 있다.
하나 이상의 데이터를 저장하는 리스트 같은 경우 저장 순서가 의미가 있었다.
딕셔너리 같은 경우, 리스트와 다르게 데이터의 저장순서가 의미를 가지지 않는다.
(사전 관점에서 보자. 사전은 순서가 중요하지 않음)
dc = {
'코카콜라' : 900,
'바나나맛우유': 750,
'비타500' : 700,
'삼다수' : 450
}
: 을 기준으로 왼쪽의 코카콜라가 key이고 오른쪽의 900이 value이다.
출력을 해보면
{'코카콜라' : 900, '바나나맛우유': 750, '비타500' : 700, '삼다수' : 450} 식으로 저장이 되어있는 것을 알 수 있다.
딕셔너리에서 얘기하는 값이라는 것은 key와 value가 하나의 쌍을 이룬 다는 것이 핵심이다
key는 문자열 이외에도 무엇이든 등장할 수 있다.(물론 못 오는 것도 있다.)
value는 정수, 실수, 문자열, 튜플, 리스트 등 어떤 것이든 넣을 수 있다. 종류를 다양하게 넣을 수도 있다.
dc = {
'이름' : '이용진', #값이 문자열
'나이' : 24, #값이 정수
'직업' : '백수', #값이 문자열
'키' : 180.7 #값이 실수 // 평생 179로 살다가 최근 180 넘어서 굳이 넣어봄 ㅎ.ㅎ
}
딕셔너리에 토끼:value라는 정보를 담았으면 꺼낼 때도 토끼라는 key를 이용해서 데이터를 꺼내게 된다.
만약 토끼라는 key가 두 개 존재한다면?? 꺼낼 때 문제가 생길 것이다.
즉 딕셔너리의 key는 중복이 불가능하다.
딕셔너리는 저장순서가 중요하지 않다.
저장순서를 고려해야 하는 입장에서는 딕셔너리를 사용하면 안 된다.
즉 저장순서까지 의미를 부여해야 한다면! 딕셔너리를 사용하면 안 된다! (강조강조강조)
dc = {
'이용진' : 22,
'김용진' : 22,
'박용진' : 22
}
key는 중복이 안되지만 value는 얼마든지 중복가능하다.
파이썬의 딕셔너리는 key가 중복되지 않는다는 가정하에 만들어졌다.
따라서 동명이인에 대한 처리를 하고 싶을 때는 딕셔너리를 쓰면 안 되는 것이다.
key가 중복될 가능성이 있다면 딕셔너리에 담을 대상이 아닌 것.
dc = {
'이용진' : 22,
'이용진' : 23,
'이용진' : 24
}
위의 딕셔너리를 출력하면 {'이용진' : 24}만 출력이 된다.
이렇게 key가 중복이 된다면 데이터를 3개를 저장했지만 1개만 남은 왜곡이 발생한다.
이런 식으로 저장하면 안 된다는 것만 인지하자. 이것이 딕셔너리가 가진 특징이다.
#딕셔너리의 참조
dc = {
'코카콜라' : 900,
'바나나맛우유' : 750,
'비타500' : 600,
'삼다수' : 450
}
v = dc['삼다수']
# dc라는 딕셔너리에게 '삼다수'라는 key를 줄테니, key에 해당하는 value를 달라는 뜻이다.
# '삼다수'에 해당하는 value인 450이 dc['삼다수']을 대신하게 되고, 그것이 변수 v에 저장된다.
딕셔너리를 참조하는 방법은 인덱싱 연산을 사용하는 것이다.
원래는 인덱싱 연산을 할 때 인덱스값이라는 정수를 넣었지만 이제는 딕셔너리의 key를 넣어준다.
v를 출력하면 450이 출력된다.
#딕셔너리의 수정
dc = {
'코카콜라' : 900,
'바나나맛우유' : 750,
'비타500' : 600,
'삼다수' : 450
}
dc['삼다수'] = 550
key는 수정할 수 없다. 고정이다.
사전에서 토끼에 대한 정보를 수정할 수는 있어도 토끼라는 제목 자체를 거북이로 바꾸면 문제가 있지 않겠는가
즉 딕셔너리의 수정은 key의 수정이 아니라 value의 수정이다.
수정하는 방법 또한 인덱싱 연산이다.
#딕셔너리의 추가
dc['삼다수'] = 550
위 코드는 때에 따라서 '수정'이 되기도 하지만 데이터의 '추가'로 이어지기도 한다.
딕셔너리 안에 '삼다수'라는 key가 존재할 때 위의 코드는 '삼다수'의 value값을 '수정'하게 된다.
하지만 '삼다수'라는 key가 없다면, 딕셔너리 안에 '삼다수'라는 key와 550이라는 value를 '추가'하게 된다.
정리하자면 딕셔너리의 수정문법과 추가문법이 같다.
즉 기존의 데이터가 있으면 수정, 없었으면 추가이다. 쓸 때만 조심하면 된다.
dc['카페라떼'] = 1300
위의 코드만 봐서는 딕셔너리가 수정되는지, 추가되는지 구분할 수 없다.
딕셔너리 안을 확인해 봐야 수정인지, 추가인지 확인할 수 있다.
#딕셔너리 삭제
del dc['비타500']
dc라는 변수에 담긴 딕셔너리에 '비타 500' key에 해당하는 데이터를 지우는 것이다.
t1 = [1,2,3]
t2 = [1,2,3]
t3 = [3,2,1]
print(t1 == t2) #True 출력
print(t1 == t3) #False 출력
t1과 t3는 저장하고 있는 데이터의 종류는 같지만 데이터의 위치가 다르다.
즉 순서가 다르기에 t1과 t3는 같지 않다고 판단하는 것
리스트 입장에서 == 가 True를 반환했다는 것은
저장하고 있는 값의 수, 종류, 순서 모든 것이 같음을 의미한다.
d1 = {1: 'a', 2: 'b'}
d2 = {1: 'a', 2: 'b'}
d3 = {2: 'b', 1: 'a'}
print(d1==d2) #True 출력
print(d1==d3) #True 출력
딕셔너리 입장에서 ==가 True를 반환했다는 것은
저장하고 있는 값의 수, 종류가 같음을 의미한다.
즉 딕셔너리에서 저장순서는 관심사가 아니다.
그렇기에 위의 3개의 딕셔너리가 다 같다고 판단한다
딕셔너리의 in연산과 not in 연산
if '새우깡' in dc2:
dc2['새우깡'] = 950
만약 dc2의 딕셔너리에 '새우깡'이 있다면 '새우깡'의 value를 수정하라는 뜻
if '카페라떼' not in dc1:
dc1['카페라떼'] = 1200
만약 dc1의 딕셔너리에 '카페라떼'가 없다면 '카페라떼' : 1200을 추가하라는 뜻
딕셔너리와 for 루프
dc = {'새우깡' : 700, '콘치즈' : 850, '꼬깔콘' : 750}
for i in dc:
print(i,end = ' ')
for문에서 dc 딕셔너리의 key만 i로 넘어가게 된다.
그렇기에 [새우깡 콘치즈 꼬깔콘] 이 출력될 것이다.
주의 : 새우깡,콘치즈,꼬깔콘이 순서대로 출력 됐다고 해서, 리스트를 바라보듯이
순서대로 데이터가 저장되어 있을 거라는 이론적인 짐작은 잘못된 결과를 얻을 수 있다.
[콘치즈 새우깡 꼬깔콘]처럼 새우깡이 중간에 출력돼도 이상할 것이 없다.
왜냐하면 딕셔너리는 순서를 고려하지 않기 때문.
딕셔너리에서 저장순서는 아예 생각하면 안 된다!!! (강조)
dc = {'새우깡': 700, '콘치즈': 850, '꼬깔콘': 750}
for i in dc:
dc[i] += 70
i에 key를 전달하고 인덱싱 연산을 통해 value값에 70씩 더하는 코드이다
출력하면 {'새우깡': 770, '콘치즈': 920, '꼬깔콘': 820}이 출력될 것이다.
딕셔너리는 리스트처럼 for문을 자주 쓰지는 않는다 다만 필요할 때가 있긴 하다. 그러니 구성할 수 있다는 사실을 기억하자
'프로그래밍 언어 > 파이썬 기초' 카테고리의 다른 글
파이썬 지역변수와 전역변수 (0) | 2023.06.06 |
---|---|
파이썬 모듈 import (0) | 2023.05.23 |
파이썬 함수 매개변수 등 (0) | 2023.05.23 |
파이썬 튜플,range (0) | 2023.05.23 |
파이썬 for문,while문 (0) | 2023.05.23 |