본문 바로가기
파이썬/Basics(기초)

[Python] 9. 딕셔너리(dictionary), 데이터 만들기

by 쿠킷리스트 2021. 10. 5.

학습내용

#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라는 keyvalue를 '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]}
  1. 작은 것부터 시작한다.
  2. 수강정보를 myclass 변수에 리스트 안의 튜플 형태로 저장.
  3. 성적을 score 변수에 리스트 형태로 저장.
  4. 전체 자료를 stddic 변수 안에 딕셔너리 형태로 저장.
  5. 한 명의 학생 정보를 딕셔너리 안에 담을 수 있다.

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인분
  • 여러 종류의 데이터를 위와 같이 만들 수 있다.

댓글