딕셔너리
키와 값의 쌍으로 데이터를 저장하는 동적 자료형
딕셔너리를 사용하는 이유는 뭘까 ?
딕셔너리는 고유한 키와 값의 쌍으로 구성되어 있다.
값은 키를 통해 참조되며 찾고자 하는 값을 빠르게 찾을 수 있다.
dic = {'name' : 'kim', 'age' : 30, 'bir' : 'jun'}
print(dic) # {'name': 'kim', 'age': 30, 'bir': 'jun'} 키와 값의 쌍을 반환
print(type(dic)) # <class 'dict'> 반환
리스트는 특정 값을 찾고자 하면 처음 순서부터 마지막 순서까지 순회하여 값을 찾는 동작을 수행하는데 반해 딕셔너리는 키를 기반으로 빠르게 찾을 수 있다는 장점이 있다는 것이다.
딕셔너리 표현방법
딕셔너리는 중괄호 {} 를 사용하며 중괄호 안에 키와 값을 기입하여 표현한다.
dic = {'name' : 'kim', 'age' : 30, 'bir' : 'jun'}
print(dic) # {'name': 'kim', 'age': 30, 'bir': 'jun'} 키와 값의 쌍을 반환
print(type(dic)) # <class 'dict'> 반환
· 키를 중복으로 사용할 경우 값을 덮어 씌워버리니 키 중복 사용은 하지 않도록 하자.
dic = {'name' : 'Kim', 'name' : 'John', 'name' : 'Bob'}
print(dic) # Bob 반환
· 키는 불변의 고유한 값으로 변경 가능한 동적 타입인 리스트를 키로 사용할 수 없다. 리스트를 키로 사용하자 TypeError 가 발생한 모습.
dic = {['name'] : ['kim', 'bob']}
print(dic) # TypeError: unhashable type: 'list' 에러 반환
∴ 리스트 대신에 문자열이나 숫자열 혹은 튜플과 같은 불변 타입을 키로 사용하도록 하자.
dic1 = {'name' : ['kim', 'bob']}
dic2 = {('name') : ['kim, 'bob']}
print(dic1) # {'name': ['kim', 'bob']} 반환
print(dic2) # "
딕셔너리 연산
딕셔너리는 키와 값의 쌍이 순서를 가지지 않고, 키는 고유해야 하기 때문에 산술 연산자를 지원하지 않는다.
· 더하기나 곱하기 연산자를 사용하는 경우 해당 연산자를 딕셔너리에서 지원하지 않는다는 TypeError 가 발생하는 모습.
dic1 = {'a' : 1, 'b' : 2}
dic2 = {'c' : 3, 'd' : 4}
res = dic1 + dic2
print(res) # TypeError: unsupported operand type(s) for +: 'dict' and 'dict' 오류 반환
딕셔너리 추출
딕셔너리에서는 대괄호 [] 를 사용하여 원하는 값을 추출할 수 있다.
값에 접근하고자 할 경우 고유한 키를 통해야 한다는 것을 계속 유의하도록 하자.
· 대괄호 [] 를 사용해 고유한 키의 값을 추출하는 모습
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
print(dic['name']) # ['kim', 'bob', 'merry'] 반환
print(dic['age']) # [20, 30, 40] 반환
· 추출한 값을 변경하거나 새로운 키와 값의 쌍을 추가할 수도 있다.
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
dic['name'][0] = 'A'
dic['name'][1:3] = ['B', 'C']
dic['age'][0:] = [10, 20, 30]
dic['num'] = [1, 2, 3]
print(dic) # {'name': ['A', 'B', 'C'], 'age': [10, 20, 30], 'num': [1, 2, 3]} 반환
## 'name', 'age' 키의 값 변경, 'num' 키와 값 추가
딕셔너리 함수
파이썬에서는 딕셔너리를 다루는 데 유용한 함수를 제공한다.
(많이 사용되는 함수 앞에는 * 별 문자를 표기할 것이며, 찾고자 하는 함수가 있다면 Cnt + F 를 통해 찾길 바란다.)
· * dic.keys(), values(), items() : 딕셔너리의 모든 키, 모든 값, 모든 키와 값의 쌍을 반환하는 함수들이다.
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
print(dic.keys()) # dict_keys(['name', 'age'])
## 모든 키 반환
print(dic.values()) # dict_values([['kim', 'bob', 'merry'], [20, 30, 40]])
## 모든 값 반환
print(dic.items()) # dict_items([('name', ['kim', 'bob', 'merry']), ('age', [20, 30, 40])])
## 모든 키와 값의 쌍 반환
· * dic.get() : 딕셔너리의 키를 조회하여 해당하는 값들을 반환하는 함수이다. 단, 대괄호 [] 연산자와는 다르게 get 함수는 값을 추출만 할 뿐 수정할 수는 없다.
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
print(dic.get('name')) # ['kim', 'bob', 'merry'] # name 키에 해당하는 값들을 반환
· * dic.update() : 현재 딕셔너리에 키-값 쌍을 업데이트하거나, 다른 딕셔너리로 업데이트하는 함수이다.
- 현재 딕셔너리에 키-값 쌍을 업데이트하는 경우
dic = {'name' : ['kim'], 'age' : [20]}
dic.update(name = 'bob', job = 'singer')
print(dic) # {'name': 'bob', 'age': [20], 'job': 'singer'} 반환
- 다른 딕셔너리로 업데이트하는 경우
dic1 = {'name' : ['kim', 'bob', 'merry']}
dic2 = {'name' : ['A', 'B', 'C']}
dic3 = {'age' : [20, 30, 40]}
dic1.update(dic2) ## dic1 딕셔너리를 dic2 딕셔너리로 업데이트
dic1.update(dic3) ## dic1 딕셔너리에 dic3 딕셔너리 업데이트
print(dic1) # {'name': ['A', 'B', 'C'], 'age': [20, 30, 40]} 반환
· del() : 특정 키와 값을 메모리 상에서 완전히 제거하는 함수이다.
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
del(dic)['name'][-1]
del(dic)['age']
print(dic) # {'name': ['kim', 'bob']} 반환
· * pop() : 특정 키와 값을 제거하고, 그 값을 반환하는 함수이다. 제거된 함수를 확인하거나 변수에 담아 다른 곳에 활용할 수 있다.
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
pop_value = dic.pop('name')
print(pop_value) # ['kim', 'bob', 'merry'] 삭제한 키와 값 반환
- del 함수는 키와 값의 쌍을 완전히 제거해 버리기 때문에 변수에 담아 활용할 수 없다. 잘못된 구문이라는 SyntaxError 에러가 발생하는 모습
dic = {'name' : ['kim', 'bob', 'merry'], 'age' : [20, 30, 40]}
del(dic)['name']
print(dic) # {'age': [20, 30, 40]} 메모리 상의 name 키와 값의 쌍을 완전히 삭제 후 반환
del_value = del(dic)['name']
print(del_value) # SyntaxError: invalid syntax 오류 반환
· zip() : 키 리스트와 값 리스트를 쌍으로 묶어 새로운 딕셔너리를 만드는 함수이다. 두 개 이상의 인자를 받아 각 리스트의 같은 위치에 있는 요소를 튜플로 묶은 리스트를 반환한다.
keys = ['kim', 'bob', 'merry']
values = [20, 30, 40]
zip(keys, values) # <zip at 0x7d315509ae80> 메모리에 저장되어 메모리 주소 반환
print(type(zip(name, age))) # <class 'zip'> 반환
- 해당 튜플은 dict() 함수를 통해 딕셔너리로 형변환하여 사용할 수 있는 상태가 된다.
keys = ['kim', 'bob', 'merry']
values = [20, 30, 40]
dict(zip(keys, values)) # {'kim': 20, 'bob': 30, 'merry': 40} 딕셔너리로 반환
파이썬에서의 딕셔너리에 대해 알아보았다.
데이터를 고유한 키에 저장함으로써 접근 및 활용하기 쉬운 것이 장점이라 특정한 값을 찾는데 유용하게 사용할 수 있을 것이다.
딕셔너리는 순서를 가지지 않지만 리스트는 순서를 가지기 때문에 순서가 중요한 데이터 혹은 제어문으로 활용하는데 유용할 것이다.
또한, 딕셔너리는 고유한 키를 통해 데이터를 참조할 수 있는데 반해 리스트는 고유한 위치(인덱스)를 통해 데이터를 참조할 수 있다는 점 또한 다른 점이라 할 수 있겠다.
다음 글에는 참 또는 거짓을 나타내는 자료형인 불리언에 대해 알아보도록 하자.
'[파이썬] > 자료형' 카테고리의 다른 글
[파이썬][자료형] 집합 (0) | 2023.11.05 |
---|---|
[파이썬][자료형] 불리언 (0) | 2023.11.05 |
[파이썬][자료형] 배열 (0) | 2023.11.04 |
[파이썬][자료형] 문자형 (0) | 2023.11.04 |
[파이썬][자료형] 숫자형 (0) | 2023.11.03 |