! 지금까지 리스트와 튜플처럼 여러 개의 값을 저장할 수 있는 자료형을 알아보았다.
이번에는 Key와 Value를 한 쌍으로 저장하는 딕셔너리(dictionary) 자료형에 대해 알아보자.
예를 들어 사람에 대한 정보를 저장한다고 생각해 보자.
이처럼 어떤 값을 찾기 위한 기준(Key)과 그에 해당하는 값(Value)을 서로 연결해서 저장할 수 있다.
다른 프로그래밍 언어에서는 이러한 형태를 연관 배열(associative array) 또는 해시(hash)라고 부르기도 한다.
딕셔너리(dictionary)는 영어로 사전이라는 뜻이다.
apple → 사과
baseball → 야구
python → 파이썬
{"apple": "사과", "baseball": "야구"}
"apple"과 "baseball"은 Key이다."사과"와 "야구"는 각각의 Key에 대응하는 Value이다.리스트와 딕셔너리의 값을 가져오는 방식에는 차이가 있다.
a = ['apple', 'banana', 'orange']
a[0]
'apple'
a = {'apple': '사과', 'banana': '바나나'}
a['apple']
'사과'
즉, 딕셔너리는 위치가 아니라 Key를 이용해서 Value를 찾는 자료형이다.
파이썬 3.7부터는 딕셔너리에 데이터를 추가한 순서가 유지된다.
a = {'name': 'pingu', 'age': 20, 'job': 'developer'}
딕셔너리는 중괄호
{}를 사용해서 만든다.
딕셔너리명 = {Key1: Value1, Key2: Value2, Key3: Value3, ...}
Key : Value
,로 구분한다.다음은 사람의 정보를 저장한 딕셔너리이다.
>>> dic = {'name': 'pingu', 'phone': '010-1234-5678', 'birth': '1225'}
| Key | Value |
|---|---|
| name | pingu |
| phone | 010-1234-5678 |
| birth | 1225 |
>>> a = {1: 'hi'}
Key = 1
Value = 'hi'
가 된다.
>>> a = {'a': [1, 2, 3]}
Key = 'a'
Value = [1, 2, 3]
딕셔너리의 Value에는 문자열, 숫자, 리스트, 튜플 등 다양한 자료형을 저장할 수 있다.
딕셔너리는 만들어진 이후에도 새로운
Key: Value쌍을 추가하거나 기존 요소를 삭제할 수 있다.
먼저 다음 딕셔너리를 만들어 보자.
>>> a = {1: 'a'}
딕셔너리명[Key] = Value
>>> a[2] = 'b'
>>> a
{1: 'a', 2: 'b'}
a[2] = 'b'를 실행하면Key = 2
Value = 'b'
인 새로운 요소가 추가된다.
>>> a['name'] = 'pingu'
>>> a
{1: 'a', 2: 'b', 'name': 'pingu'}
>>> a[3] = [1, 2, 3]
>>> a
{1: 'a', 2: 'b', 'name': 'pingu', 3: [1, 2, 3]}
딕셔너리에 요소를 추가할 때는
딕셔너리[Key] = Value형태를 사용한다.
딕셔너리의 특정 요소를 삭제하려면
del을 사용할 수 있다.
>>> a = {1: 'a', 2: 'b', 'name': 'pingu'}
>>> del a[1]
>>> a
{2: 'b', 'name': 'pingu'}
del 딕셔너리명[Key]
del a[1]은 딕셔너리에서 Key가 1인 Key와 Value 쌍 전체를 삭제한다.1 : 'a'
가 함께 삭제되는 것이다.
딕셔너리에서 가장 중요한 것은 Key를 이용해서 Value를 찾는 것이다.
>>> grade = {'pingu': 90, 'minsu': 80}
'pingu'라는 Key의 값을 확인하려면 다음과 같이 작성한다.>>> grade['pingu']
90
'minsu'의 값을 확인해 보자.>>> grade['minsu']
80
딕셔너리에서 값을 가져오는 기본 형태는 다음과 같다.
딕셔너리명[Key]
다음 두 자료형을 비교해 보자.
a = ['a', 'b', 'c']
a[1]
'b'
a[1]은 인덱스 번호가 1인 두 번째 요소를 의미한다.a = {1: 'a', 2: 'b'}
>>> a[1]
'a'
a[1]의 1은 인덱스 번호가 아니다.Key 1 → Value 'a'
! 리스트와 딕셔너리의
a[1]차이
- 리스트
a[1]→ 두 번째 요소- 딕셔너리
a[1]→ Key가1인 Value
>>> a = {'name': 'pingu', 'age': 20}
>>> a['name']
'pingu'
>>> a['age']
20
딕셔너리는 리스트처럼 위치를 이용한 인덱싱을 하는 것이 아니라 Key를 직접 지정해서 Value를 가져온다.
딕셔너리를 사용할 때 반드시 알아 두어야 할 몇 가지 특징이 있다.
딕셔너리의 Key는 각각 고유해야 한다.
>>> a = {1: 'a', 1: 'b'}
>>> a
{1: 'b'}
1을 두 번 사용했지만 최종적으로 하나만 남았다.'b'가 남게 된다.그 이유는 딕셔너리가 Key를 이용해서 Value를 찾기 때문이다.
1 → 'a'
1 → 'b'
1에 서로 다른 Value가 존재하면 어떤 값을 가져와야 하는지 구분할 수 없다.따라서 딕셔너리의 Key는 중복해서 사용할 수 없다.
딕셔너리의 Key에는 아무 자료형이나 사용할 수 있는 것은 아니다.
>>> a = {[1, 2]: 'hi'}
TypeError: unhashable type: 'list'
a = [1, 2, 3]
a[0] = 10
>>> a = {(1, 2): 'hi'}
간단하게 기억하면 다음과 같다.
리스트 → Key 사용 X
튜플 → Key 사용 O
a = {
'number': 10,
'name': 'pingu',
'list': [1, 2, 3],
'tuple': (4, 5)
}
딕셔너리도 리스트처럼 변수 이름 뒤에
.을 붙여 여러 가지 기능을 사용할 수 있다.
딕셔너리명.함수()
keys()는 딕셔너리에 존재하는 Key들을 가져오는 함수이다.
>>> a = {'name': 'pingu', 'phone': '010-1234-5678', 'birth': '1225'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])
dict_keys 객체이다.list()를 사용해서 변환할 수 있다.>>> list(a.keys())
['name', 'phone', 'birth']
dict_keys는 반복문에서 그대로 사용할 수도 있다.>>> for k in a.keys():
... print(k)
...
name
phone
birth
아직
for문을 배우지 않았다면 지금은keys()가 Key들을 가져오는 함수라는 정도로 이해하고 넘어가자.
values()는 딕셔너리의 Value들만 가져온다.
>>> a = {'name': 'pingu', 'phone': '010-1234-5678', 'birth': '1225'}
>>> a.values()
dict_values(['pingu', '010-1234-5678', '1225'])
keys()가 Key를 가져왔다면 values()는 Value를 가져온다.keys() → Key
values() → Value
items()는 딕셔너리의 Key와 Value를 한 쌍씩 가져온다.
>>> a = {'name': 'pingu', 'phone': '010-1234-5678', 'birth': '1225'}
>>> a.items()
dict_items([('name', 'pingu'), ('phone', '010-1234-5678'), ('birth', '1225')])
('name', 'pingu')
('phone', '010-1234-5678')
('birth', '1225')
정리하면 다음과 같다.
| 함수 | 가져오는 값 |
|---|---|
keys() | Key |
values() | Value |
items() | Key와 Value 쌍 |
clear()는 딕셔너리 안에 있는 모든 요소를 삭제한다.
>>> a = {'name': 'pingu', 'age': 20}
>>> a.clear()
>>> a
{}
{}가 된다.빈 자료형의 표현을 비교하면 다음과 같다.
[] # 빈 리스트
() # 빈 튜플
{} # 빈 딕셔너리
get()도 Key를 이용해서 Value를 가져오는 함수이다.
>>> a = {'name': 'pingu', 'phone': '010-1234-5678'}
>>> a.get('name')
'pingu'
a['name']
a.get('name')
a[Key]와 get()의 차이두 방법의 가장 큰 차이는 존재하지 않는 Key를 찾았을 때 나타난다.
>>> a = {'name': 'pingu'}
[] 방식으로 찾으면 오류가 발생한다.>>> a['age']
KeyError: 'age'
get()을 사용하면 오류가 발생하지 않고 None을 반환한다.>>> a.get('age')
None
None은 파이썬에서 값이 없다는 것을 나타내는 특별한 객체이다.
따라서 다음과 같이 기억할 수 있다.
a[Key]
→ Key가 없으면 오류 발생
a.get(Key)
→ Key가 없으면 None 반환
get()은 찾는 Key가 없을 경우 대신 반환할 값을 지정할 수도 있다.
>>> a = {'name': 'pingu'}
>>> a.get('age', '정보없음')
'정보없음'
'age'라는 Key가 없기 때문에 미리 지정한 '정보없음'을 반환한다.딕셔너리.get(Key, 기본값)
Key가 존재하지 않을 가능성이 있을 때
get()을 사용하면 편리하다.
in을 사용하면 특정 Key가 딕셔너리에 존재하는지 확인할 수 있다.
>>> a = {'name': 'pingu', 'phone': '010-1234-5678'}
>>> 'name' in a
True
'name'이라는 Key가 존재하므로 True를 반환한다.>>> 'email' in a
False
'email'이라는 Key는 존재하지 않으므로 False를 반환한다.기본 형태는 다음과 같다.
Key in 딕셔너리
Key 존재 → True
Key 없음 → False
여기서 중요한 점은
in이 Value가 아닌 Key를 확인한다는 것이다.
>>> a = {'name': 'pingu'}
>>> 'name' in a
True
>>> 'pingu' in a
False
'pingu'는 Value이므로 위 표현에서는 False가 된다.
pop()은 지정한 Key의 Value를 반환하면서 해당 Key와 Value 쌍을 딕셔너리에서 삭제한다.
>>> a = {'name': 'pingu', 'phone': '010-1234-5678', 'birth': '1225'}
>>> phone = a.pop('phone')
>>> phone
'010-1234-5678'
a를 확인하면 phone 항목이 삭제되어 있다.>>> a
{'name': 'pingu', 'birth': '1225'}
즉,
pop()은 값을 꺼내는 동시에 해당 요소를 삭제한다.
get()과pop()모두 Key를 이용해서 Value를 가져올 수 있지만 중요한 차이가 있다.
get() → Value를 가져오기만 함
pop() → Value를 가져오고 해당 요소까지 삭제
| 함수 | Value 반환 | 요소 삭제 |
|---|---|---|
get() | O | X |
pop() | O | O |
pop()도 존재하지 않는 Key를 찾을 때 기본값을 지정할 수 있다.>>> a = {'name': 'pingu'}
>>> email = a.pop('email', '정보없음')
>>> email
'정보없음'
'email'이라는 Key가 없으므로 기본값 '정보없음'을 반환한다.지금까지 배운 딕셔너리 관련 기능을 정리하면 다음과 같다.
| 사용법 | 설명 |
|---|---|
a[key] | Key에 해당하는 Value 가져오기 |
a[key] = value | 새로운 Key와 Value 추가 또는 기존 값 변경 |
del a[key] | Key와 Value 쌍 삭제 |
a.keys() | 모든 Key 가져오기 |
a.values() | 모든 Value 가져오기 |
a.items() | 모든 Key와 Value 쌍 가져오기 |
a.clear() | 모든 요소 삭제 |
a.get(key) | Key로 Value 가져오기 |
a.get(key, 기본값) | Key가 없으면 기본값 반환 |
key in a | Key 존재 여부 확인 |
a.pop(key) | Value를 반환하고 해당 요소 삭제 |
딕셔너리에서 가장 중요한 내용을 정리하면 다음과 같다.
{}를 사용한다.a = {'name': 'pingu', 'age': 20}
Key: Value 형태로 값을 저장한다.'name' : 'pingu'
'age' : 20
a['name']
a['job'] = 'developer'
del a['age']
a = {1: 'a', 1: 'b'}
{[1, 2]: 'hi'} # 오류
{(1, 2): 'hi'}
keys()는 Key를 가져온다.a.keys()
values()는 Value를 가져온다.a.values()
items()는 Key와 Value를 함께 가져온다.a.items()
get()을 사용하면 존재하지 않는 Key를 비교적 안전하게 처리할 수 있다.a.get('email', '정보없음')
in을 사용하면 Key가 존재하는지 확인할 수 있다.'name' in a
pop()은 Value를 반환하면서 해당 Key와 Value를 삭제한다.a.pop('name')
! 딕셔너리의 핵심
리스트는 위치(index)를 이용해서 값을 찾지만,
딕셔너리는 Key를 이용해서 Value를 찾는다.리스트 → 위치(index) : 값 딕셔너리 → Key : Value처음 딕셔너리를 공부할 때는 우선
Key → Value구조를 확실하게 이해하는 것이 가장 중요하다.