학습내용
#1 : 딕셔너리(dictionary)란 #2 : 딕셔너리 사용하기(쌍 추가, 요소 삭제, key 사용해 value 얻기, 주의사항) #3 : 딕셔너리 관련 함수 #4 : 딕셔너리와 리스트를 결합해 데이터 만들기 |
#1 : 딕셔너리(dictionary)란
딕셔너리는 해시(Hash)를 기반으로 하고 있는 자료구조로, Key와 Value를 한 쌍으로 갖는 자료형이다. 딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요소값을 구하는 것이 아닌 key를 통해 value를 얻는다.
- JSON이 가지고 있는 key와 value는 딕셔너리와 같고, JSON Array는 리스트와 유사하다.
{Key1:Value1, Key2:Value2, Key3:Value3, ...}
dic = {'name':'Koo', 'language':'Python', 'time':'20211004'}
- 딕셔너리는 key와 value의 쌍 여러 개가 중괄호{ }로 둘러싸여 있고, 각각의 요소는 쉼표(,)로 구분된다.
- Key에는 변하지 않는 값을 사용하고, Value에는 변하는 값과 변하지 않는 값 모두 사용할 수 있다.
#2 : 딕셔너리 사용하기(쌍 추가, 요소 삭제, key 사용해 value 얻기, 주의사항)
딕셔너리 쌍 추가하기
a = {1:'a'}
print(a)
#{1: 'a'}
a[2] = 'b' #2라는 key의 value를 b로 바꾸거나, 2번 key 값이 없다면 b를 추가하라
print(a)
#{1: 'a', 2: 'b'}
a['name'] = 'Koo'
print(a)
#{1: 'a', 2: 'b', 'name': 'Koo'}
a[3] = [2,3,4]
print(a)
#{1: 'a', 2: 'b', 'name': 'Koo', 3: [2, 3, 4]}
- 딕셔너리에서 a[2]는 a변수의 3번째 인덱스의 값을 찾는 것이 아니며 a[2] = 'b'는 a변수의 3번째 인덱스 값을 바꾸는 것도 아니다.
- a[2] = 'b' a라는 변수에 2라는 key의 value를 'b'로 바꾸거나, 2라는 key가 없다면 2라는 key에 'b'라는 value를 추가하라는 의미.
- 마찬가지로 a['name'] = 'koo'는 'name'이라는 key에 'koo'라는 value를 추가하라는 의미이며 a[3] = [2,3,4]는 3이라는 key에 리스트 [2,3,4]라는 value를 추가하라는 의미.
딕셔너리 요소 삭제하기
a = {1: 'a', 2: 'b', 'name': 'Koo', 3: [2, 3, 4]}
del a['name']
print(a)
#{1: 'a', 2: 'b', 3: [2, 3, 4]}
del a[2]
print(a)
#{1: 'a', 3: [2, 3, 4]}
- del 변수[key]을 입력하면 딕셔너리 요소를 삭제할 수 있다.
- a[ ]에서 대괄호 내의 숫자가 인덱스가 아니라 key 값이다. 해당 key 값을 가지고 있는 요소를 삭제.
딕셔너리에서 key 사용해 value 얻기
grade = {'koo':99, 'lee':78, 'han':55}
grade['koo']
#99
grade['lee']
#78
- 어떠한 key의 value를 얻기 위해서는 변수[key]를 사용한다.
딕셔너리 만들 때 주의 사항
- 딕셔너리에서 key는 고유한 값이므로 중복되는 key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다. 따라서, 중복 제거하는 데에도 유용하게 사용할 수 있다.(집합, set과 유사)
a = {'name':'koo', 'name':'kim', 'name':'han'}
a
#{'name': 'han'}
- key에 리스트는 사용할 수 없다.(value에 리스트는 사용 가능.) 딕셔너리의 key 사용 가능 여부는 key가 변하는 값인지 아닌지에 달려있다. 변하는 값은 key 사용할 수 없다.
a = {[1,3,5]:'1,3,5'}
a
#Error
#3 : 딕셔너리 관련 함수
Key 리스트 만들기(keys)
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.keys()
#dict_keys(['name', 'language', 'time'])
- 변수.keys() 함수를 사용하면 딕셔너리 변수의 key 만을 모아서 dict_keys 객체를 돌려준다.
for i in a.keys():
print(i)
#name
#language
#time
- 큰 딕셔너리에서 모든 키를 조회해봐 라고 명령하고 싶다면 key 리스트를 만들어 조회하면된다.
list(a.keys())
#['name', 'language', 'time']
- 다시 리스트로 변환해서 사용할 수도 있다.
Value 리스트 만들기(values)
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.values()
#dict_values(['Koo', 'Python', '20211004'])
for i in a.values():
print(i)
#Koo
#Python
#20211004
list(a.values())
#['Koo', 'Python', '20211004']
- 변수.values() 함수를 사용해 key 리스트를 만든 것처럼 value 리스트 역시 만들 수 있다.
- 딕셔너리 변수의 value 만을 모아서 dict_values 객체를 돌려준다.
Key, Value 쌍 얻기(items)
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.items()
#dict_items([('name', 'Koo'), ('language', 'Python'), ('time', '20211004')])
- 변수.items() 함수를 사용해 key와 value의 쌍을 튜플로 묶은 값을 dict_items 객체로 반환.
Key : Value 쌍 모두 지우기(clear)
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.clear()
print(a)
#{}
- 변수.clear() 함수를 사용하면 변수 안의 모든 요소가 삭제되고 빈 딕셔너리가 반환된다.
Key로 Value 얻기(get)
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.get('name')
#'Koo'
a['name']
#'koo'
- 변수.get() 함수를 사용해서 key 값으로 value를 구할 수 있다.
- 변수[key]와 똑같은 기능을 하지만, 존재하지 않는 키로 값을 가져오라고 할 경우 다른 값을 반환한다.
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.get('error')
#None
a['error']
#Error
- get 함수의 경우 없는 key로 값을 가져오라고 할 때 None 값을 반환하고 변수[ ]의 경우 에러가 발생한다.
- 문자열 함수에서 find(-1)와 index(Error)가 없는 값을 찾을 때 반환하는 값과 유사하다.
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
a.get('score', 0)
#0
a.get('good', 2)
#2
- .get(x, '디폴트 값')은 딕셔너리 안에 찾으려는 key 값이 없을 경우 디폴트 값을 설정하는 것.
해당 key가 딕셔너리 안에 있는지 조사하기(in)
a = {'name':'Koo', 'language':'Python', 'time':'20211004'}
'name' in a
#True
'name' not in a
#False
'score' in a
#False
'score' not in a
#True
- key in 변수를 사용해 딕셔너리 안에 key값이 있는지 확인할 수 있다.
#4 : 딕셔너리와 리스트를 결합해 데이터 만들기
1) 학생 정보를 딕셔너리에 담기
Student(KOO) | |
이름 | 홍길동 |
학번 | 20200101 |
수강정보 | 영어, 파이썬, 데이터 시각화 |
성적 | 3.9, 4.1, 3.6 |
상세성적 | 영어 A+, 파이썬 B, 데이터 시각화 C |
#1 : 수강정보
myclass = [("영어", "A+"),("파이썬", "B"),("데이터 시각화", "C")]
print(myclass)
#[('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')]
#2 : 성적
score = [3.9, 4.1, 3.6]
print(score)
#[3.9, 4.1, 3.6]
#3 : 종합
stddic = {"이름":"KOO","학번":20200101,"수강정보":myclass,"성적":score}
print(stddic)
#{'이름': 'KOO', '학번': 20200101, '수강정보': [('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')], '점수': [3.9, 4.1, 3.6]}
- 작은 것부터 시작한다.
- 수강정보를 myclass 변수에 리스트 안의 튜플 형태로 저장.
- 성적을 score 변수에 리스트 형태로 저장.
- 전체 자료를 stddic 변수 안에 딕셔너리 형태로 저장.
- 한 명의 학생 정보를 딕셔너리 안에 담을 수 있다.
2) 여러명의 학생 정보를 딕셔너리에 담기
#1번 학생 정보
myclass1 = [("영어", "A+"),("파이썬", "B"),("데이터 시각화", "C")]
score1 = [3.9, 4.1, 3.6]
stddic1 = {"이름":"KOO","학번":20200101,"수강정보":myclass1,"성적":score1}
#2번 학생 정보
myclass2 = [("영어", "B+"),("파이썬", "A+"),("데이터 시각화", "A+")]
score2 = [4.2, 4.3, 4.5]
stddic2 = {"이름":"HAN","학번":20190102,"수강정보":myclass2,"성적":score2}
print(stddic1)
print(stddic2)
#{'이름': 'KOO', '학번': 20200101, '수강정보': [('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')], '성적': [3.9, 4.1, 3.6]}
#{'이름': 'HAN', '학번': 20200102, '수강정보': [('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')], '성적': [3.9, 4.1, 3.6]}
- 1)과정을 반복해 여러 학생의 정보를 만들면 된다.
3) 딕셔너리에 담은 학생 정보를 하나의 묶음으로 만들기
stdset = [stddic1, stddic2]
print(stdset)
#[{'이름': 'KOO', '학번': 20200101, '수강정보': [('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')], '성적': [3.9, 4.1, 3.6]}, {'이름': 'HAN', '학번': 20200102, '수강정보': [('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')], '성적': [3.9, 4.1, 3.6]}]
- set으로 stddic1, stddic2를 하나의 리스트 안에 담을 수 있다.
4) 원하는 학생의 정보를 가져오기
#첫 번째 학생 정보
print(stdset[0])
#{'이름': 'KOO', '학번': 20200101, '수강정보': [('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')], '성적': [3.9, 4.1, 3.6]}
#첫 번째 학생의 과목별 성적
print(stdset[0]["수강정보"])
#[('영어', 'A+'), ('파이썬', 'B'), ('데이터 시각화', 'C')]
- stdset[0]을 사용해 stdset 의 첫 번째 요소를 가져오면 첫 번째 학생 정보를 가져올 수 있다.
- 첫 번째 학생의 과목별 성적을 가지고 오고 싶다면
- stdset[0]을 사용해 첫 번째 학생 정보를 가져오고,
- 원하는 key 값("수강정보")을 대괄호 안에[ ] 입력해 값을 가져온다. stdset[0]["수강정보"]
5) 첫 번째 학생의 영어 성적 가져오기
print(stdset[0]["수강정보"][0][1])
- 첫 번째 학생의 영어 성적을 가져오기 위해서는 (첫 번째 학생 정보 - 수강정보 - 영어 - 성적) 순으로 값을 찾아가야한다.
- stdset[0]으로 첫 번째 학생의 정보를 가져온다.
- stdset[0]["수강정보"]로 첫 번째 학생의 수강 정보를 가져온다.
- stdset[0]["수강정보"][0]으로 수강 정보의 (영어) 첫 번째 튜플 값을 가져온다.
- stdset[0]["수강정보"][0][1]로 첫 번째 튜플 값의 두 번째 값을 가져온다.
- 위 과정을 거쳐 첫 번째 학생의 영어 성적을 구할 수 있다. 하지만, 이는 각 학생의 교과목이 수강 정보의 몇 번째 자리에 위치하고 있는지 알아야 사용할 수 있는 방법이기에 좋지 못하다.
6) 자료 구조를 바꿔 첫 번째 학생의 영어 성적을 쉽게 가져오기
#1번 학생 정보
#myclass1 = [("영어", "A+"),("파이썬", "B"),("데이터 시각화", "C")]
myclass1 = {"영어":"A+","파이썬":"B","데이터 시각화":"C"}
score1 = [3.9, 4.1, 3.6]
stddic1 = {"이름":"KOO","학번":20200101,"수강정보":myclass1,"성적":score1}
#2번 학생 정보
#myclass2 = [("영어", "B+"),("파이썬", "A+"),("데이터 시각화", "A+")]
myclass2 = {"영어":"B+","파이썬":"A+","데이터 시각화":"A+"}
score2 = [4.2, 4.3, 4.5]
stddic2 = {"이름":"HAN","학번":20200102,"수강정보":myclass2,"성적":score2}
stdset = [stddic1, stddic2]
print(stdset[0]["수강정보"]["영어"])
#A+
print(stdset[0]["수강정보"]["파이썬"])
#B
- 기존의 mycalss1과 myclass2를 리스트가 아닌 딕셔너리로 바꿔준다.
- 바꿔주면 순서가 아니라 key 값으로 성적을 가져올 수 있다.
7) 성적을 학기별 성적으로 바꾸기
#1번 학생 정보
myclass1 = {"영어":"A+","파이썬":"B","데이터 시각화":"C"}
#score1 = [3.9, 4.1, 3.6]
score1 = {'1-1':3.9, '1-2':4.1, '2-1':3.6}
stddic1 = {"이름":"KOO","학번":20200101,"수강정보":myclass1,"성적":score1}
#2번 학생 정보
myclass2 = {"영어":"B+","파이썬":"A+","데이터 시각화":"A+"}
#score2 = [4.2, 4.3, 4.5]
score2 = {'1-1':4.2, '1-2':4.3, '2-1':4.5}
stddic2 = {"이름":"HAN","학번":20200102,"수강정보":myclass2,"성적":score2}
stdset = [stddic1, stddic2]
print(stdset[0]["성적"]["1-2"])
#4.1
print(stdset[1]["성적"]["2-1"])
#4.5
- 기존의 score1과 score2를 리스트가 아닌 딕셔너리로 바꿔주면서 key 값에 각 학기를 입력한다.
- 바꿔주면 key 값으로 학기별 성적을 key 값으로 가져올 수 있다.
8) 레시피 데이터로 복습하기
#1번 불고기 레시피
ingredient1 = {'고기':'500g','양파':'1/2개', '대파':'20cm'}
sauce1 = {'간장':'2T', '설탕':'1T', '다진마늘':'1/2T'}
food1 = {'요리명':'불고기', '요리번호':1, '재료':ingredient1, '소스':sauce1, '조리시간':'20분','양':'2인분'}
#2번 불고기 레시피
ingredient2 = {'고기':'1kg','양파':'2개', '대파':'40cm'}
sauce2 = {'고추장':'4T','간장':'4T', '설탕':'2.5T', '다진마늘':'2T'}
food2 = {'요리명':'고추장 불고기', '요리번호':2, '재료':ingredient2, '소스':sauce2, '조리시간':'20분','양':'4인분'}
print(food1['요리명'])
print(food1['요리번호'])
print(food1['재료']['양파'])
print(food1['양'])
# 불고기
# 1
# 1/2개
# 2인분
print('요리명 : ',food1['요리명'])
print('요리번호 : ',food1['요리번호'])
print('고추장 : ',food2['소스']['고추장'])
print('양 : ',food1['양'])
# 요리명 : 불고기
# 요리번호 : 1
# 고추장 : 4T
# 양 : 2인분
- 여러 종류의 데이터를 위와 같이 만들 수 있다.
'파이썬 > Basics(기초)' 카테고리의 다른 글
[Python] 11. 변수(variable)의 복사와 참조 (0) | 2021.10.06 |
---|---|
[Python] 10. 불(Bool), 조건문(if, elif, else) (0) | 2021.10.06 |
[Python] 8. 튜플(tuple), 집합(set) (0) | 2021.10.03 |
[Python] 7. 파이썬 리스트 함수, 수정과 삭제 (0) | 2021.09.27 |
[Python] 6. 파이썬 리스트 인덱싱, 슬라이싱, 연산 (0) | 2021.09.25 |
댓글