딕셔너리
key-value 쌍을 저장하는 변경 가능한 컬렉션.
- key는 유일하다, value는 중복 가능하다
- key에는 변경 가능한 데이터 타입은 사용할 수 없다.
- value에는 모든 타입을 사용할 수 있다.
- 데이터 구조에서 많이 사용된다.
dict
dic1 = {}
print(dic1, type(dic1))
이전 포스팅에서 확인할 수 있듯이 빈 중괄호는 딕셔너리이다.
dic2 = {1:'김사과', 2:'반하나', 3:'오렌지', 4:'이메론'}
print(dic2)
print(dic2[1]) # 인덱스가 아님. key값임.
print(dic2[3])
key값에 숫자, value값에 이름을 사용한 예시이다.
딕셔너리는 set과 같이 일반적인 인덱싱 방법으로는 접근할 수 없다. 대신 key값을 사용한다.
dic3 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(dic3)
print(dic3['no'])
print(dic3['userid'])
key값에는 숫자 외에 문자열, 튜플도 가능하다. 하지만 변경 가능한 리스트는 사용할 수 없다.
반면에 value에는 리스트도 가능하고 딕셔너리도 사용할 수 있다.
key, value 변경
# value는 변경 가능하다.
# key는 변경 불가능하다.
dic1 = {1:'apple'}
print(dic1)
dic1[100] = 'orange'
print(dic1)
dic1[50] = 'melon'
print(dic1)
# 순서가 없다.
# 값 지우기
del dic1[1] # key로 지운다.
print(dic1, type(dic1))
value를 추가하는 방법은 새로운 key에 새로운 value를 넣으면 된다.
형태는 리스트의 요소 변경 방법과 같다.
value값 변경도 마찬가지로 변경하고자 하는 key에 새로운 value를 넣으면 된다.
key값을 통해 value에 접근이 가능하기 때문에 key값을 변경하는 것은 불가능하다.
* key값 변경 여러 다른 방법으로 다른 key값에 기존 value를 복사하고 기존 key, value를 지운다면 가능하지만, 직접적으로 변경은 불가능.
key의 제약
# key의 제약
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
dic1['no'] = 10
print(dic1)
dic1['점수'] = [90, 100, 50]
print(dic1)
dic1[(1, 2, 3)] = ('🍕', '🍔', '🥗')
print(dic1)
# dic1[[1, 2, 3]] = ['🍕', '🍔', '🥗'] # TypeError: unhashable type: 'list'
dic1['과일']= {'사과':'🍎', '딸기':'🍓', '앵두':'🍒'}
print(dic1)
print(dic1['과일'])
print(dic1['과일']['딸기'])
{'no': 10, 'userid': 'apple', 'name': '김사과', 'hp': '010-1111-1111'} {'no': 10, 'userid': 'apple', 'name': '김사과', 'hp': '010-1111-1111', '점수': [90, 100, 50]} {'no': 10, 'userid': 'apple', 'name': '김사과', 'hp': '010-1111-1111', '점수': [90, 100, 50], (1, 2, 3): ('🍕', '🍔', '🥗')} {'no': 10, 'userid': 'apple', 'name': '김사과', 'hp': '010-1111-1111', '점수': [90, 100, 50], (1, 2, 3): ('🍕', '🍔', '🥗'), '과일': {'사과': '🍎', '딸기': '🍓', '앵두': '🍒'}} {'사과': '🍎', '딸기': '🍓', '앵두': '🍒'} 🍓 |
key값으로 리스트는 사용할 수 없음을 확인할 수 있다.
len()
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(len(dic1))
len() 함수로 딕셔너리 길이를 확인할 수 있다. key-value 가 한 쌍이므로 총 4쌍으로 출력된다.
keys()
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(dic1.keys()) # 리스트로 반환
딕셔너리에서 key값만 뽑고 싶을 경우 keys() 메서드를 사용한다.
keys() 메서드는 딕셔너리 내의 key값들을 '딕셔너리 뷰' 객체 형태로 반환한다.
* '딕셔너리 뷰(Dictionary View)' ( with. ChatGPT )
View객체는 리스트, 딕셔너리, 집합의 일부나 특정 부분을 나타내는 객체이다.
원본 데이터를 변경하지 않고 데이터에 대한 다양한 접근 방법을 제공한다.
- 'dict_keys': 딕셔너리의 키들을 나타내며, 수정할 수 없다.
- 'dict_values': 딕셔너리의 값들을 나타내며, 수정할 수 없다.
- 'dict_items': 딕셔너리의 쌍들을 나타내며, 수정할 수 없다.
뷰 객체로 표현된 정보는 리스트와 유사하지만 리스트와 같이 동작할 수는 없다.
list() 함수를 사용하여 list로 변환이 가능하다.
values()
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(dic1.values())
마찬가지로 value 값들만 얻고 싶을 경우 values() 메서드를 사용한다.
items()
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(dic1.items())
key와 value를 'dict_items' 타입으로 반환한다.
get()
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(dic1['userid'])
print(dic1.get('userid'))
# get 존재의 이유
# print(dic1['age']) # KeyError: 'age'
print(dic1.get('age')) # None
print(dic1.get('age', '나이를 알 수 없음'))
# get을 사용하면 없는 key에 대해 None을 반환함, 원하는 문자열을 반환할 수도 있음.
# 에러를 다루는 것보다 None이 사용하기 편한 경우가 많을테니
딕셔너리는 인덱스가 아닌 key값을 통해 value에 접근한다고 하였다. 하지만 없는 key를 입력하여 접근을 한다면 KeyError를 발생한다.
get() 메서드는 없는 key여도 에러가 발생하지 않는다. 있는 key를 통해 접근한다면 해당하는 value가 나올 것이고, 없는 key를 입력하면 None을 반환한다. 원하는 문자열을 반환하도록 할 수도 있다.
pop()
# pop 값을 뽑음
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print(dic1.pop('hp'))
print(dic1) # in-place
# print(dic1.pop('age')) # KeyError: 'age'
in
dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}
print('hp' in dic1)
print('age' in dic1)
in 키워드를 사용하여 딕셔너리에 해당 key값이 있는지 없는지 확인할 수 있다.
bool 타입의 값을 반환하기 때문에 제어문, 조건 등에 유용하게 사용할 수 있다.
'파이썬 > 기본' 카테고리의 다른 글
[파이썬] 조건문 (0) | 2023.09.06 |
---|---|
[파이썬] 연산자 (0) | 2023.09.05 |
[파이썬] 컬렉션 타입, 세트 (0) | 2023.09.05 |
[파이썬] 컬렉션 타입, 튜플 (0) | 2023.09.05 |
[파이썬] 컬렉션 타입, 리스트2 (0) | 2023.09.04 |
댓글