알고리즘

[자료형/Python] 딕셔너리(Dictionary)

성실한 당근농부 2024. 1. 5. 15:13
해당 포스팅은 점프 투 파이썬, 혼자 공부하는 파이썬 책을 보고 1차 정리 후, 추가 공부를 통해 보강하였습니다.

딕셔너리 자료형은 말 그대로 '사전'이라는 의미를 지니며, Key와 Value를 한 쌍으로 갖는 자료형임

  • Key:Value → baseball:야구, basketball:농구 ...

리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻음 → 딕셔너리의 가장 큰 특징!

딕셔너리 자료형은 내부적으로 해시 테이블을 이용하므로 데이터의 검색 및 수정에 있어 O(1)의 시간 복잡도를 가짐

자료형 의미 가리키는 위치 선언 형식
리스트 인덱스를 기반으로 값을 저장 인덱스 변수 = []
딕셔너리 키를 기반으로 값을 저장 변수 = {}

 

 

딕셔너리의 생성

# 기본적인 딕셔너리의 형태
{Key1:Value1, Key2:Value2, Key3:Value3, ...}

딕셔너리는 중괄호 {}로 선언 → Key에는 변하지 않는 값만을 사용하지만, Value에는 변하는 값과 변하지 않는 값 모두 사용 가능

 

# 딕셔너리 예시
dic = {'name':'pey', 'phone':'01123124', 'birth':'1118'}
Key Value
name pey
phone 01123124
birth 1118

딕셔너리 dic의 정보

 

# 딕셔너리의 Key에는 정수 값, Value에는 문자열을 사용한 예
a = {1:'hi'}

# 딕셔너리의 Key에는 문자열, Value에는 리스트를 사용한 예
b = {'a':'[1, 2, 3]}

 

dic = {
    'name':'7D 건조 망고',
    'ingredient':['망고', '설탕', '메타중아황산나트륨', '치자황색소']
}

dic['ingredient'] ### 출력 결과: ['망고', '설탕', '메타중아황산나트륨', '치자황색소']
dic['ingredient'][1] ### 출력 결과: '설탕'

해당 예시에서 ingredient는 dic의 Key기도 하지만 리스트이기도 함

따라서 인덱스를 지정해 리스트 안의 특정 값을 출력하는 것도 가능!

 

딕셔너리 쌍 추가, 삭제하기

1. 딕셔너리 쌍 추가하기

a = {1:'a'}

a[2] = 'b' # {2:'b'} 쌍 추가
print(a) ### 출력 결과 {1:'a', 2:'b'}

a['name'] = 'pey' # {'name':'pey'} 쌍 추가
print(a) ### 출력 결과 {1:'a', 2:'b', 'name':'pey'}

a[3] = [1, 2, 3] # {3:[1, 2, 3]} 쌍 추가
print(a) ### 출력 결과 {1:'a', 2:'b', 'name':'pey', 3:[1, 2, 3]}

값을 추가할 때는 Key를 기반으로 값을 입력 → 딕셔너리[새로운 키] = 새로운 값

 

2. 딕셔너리 요소 삭제하기

del a[1] # Key가 1인 Key:Value 쌍 삭제
print(a) ### 출력 결과 {2:'b', 'name':'pey', 3:[1, 2, 3]}

딕셔너리의 요소를 삭제할 때는 del 함수를 사용!

→ key를 지정하면 지정한 key에 해당하는 key:value 쌍이 삭제됨

 

딕셔너리를 사용하는 방법

딕셔너리에서 Key를 사용해 Value 얻기

grade = {'pey':10, 'julliet':99}

# Key가 'pey'인 딕셔너리의 Value를 반환
grade[pey] ### 출력 결과: 10

# Key가 'julliet'인 딕셔너리의 Value를 반환
grade[julliet] ### 출력 결과: 99

딕셔너리에서 요솟값을 얻고자 할 때 사용할 수 있는 방법은 단 한 가지 → Key를 사용해서 Value를 구하기!

 

a = {1:'a', 2:'b'}

# Key가 1인 요소의 Value를 반환
a[1] ### 출력 결과: 'a'
# Key가 2인 요소의 Value를 반환
a[2] ### 출력 결과: 'b'

###########

b = {'a':1, 'b':2}

b['a'] ### 출력 결과: 1
b['b'] ### 출력 결과: 2

###########

dic = {'name':'pey', 'phone':'01123124', 'birth':'1118'}

dic['name'] ### 출력 결과: 'pey'
dic['phone'] ### 출력 결과: '01123124'
dic['birth'] ### 출력 결과: '1118'

이 예시에서 [] 안에 들어있는 숫자 값이 index가 아님에 주의!

딕셔너리는 인덱싱 방법을 이용할 수 없기 때문에 Key를 직접 지정해주어야 함

 

딕셔너리를 만들 때의 주의사항

a = {1:'a', 1:'b', 1:'c'} # 1이라는 Key 값이 중복으로 사용됨
print(a) ### 출력 결과 {1:'c'}

딕셔너리에서 Key는 고유한 값임 → 중복되는 Key 값을 설정해두면 마지막 하나를 제외한 나머지가 모두 무시됨

  • 이는 Key를 통해 Value를 얻는 딕셔너리의 특징에서 비롯된 것으로, 동일한 Key가 존재하면 어떤 Key에 해당하는 Value를 불러야 할지 알 수 없기 때문
a = {[1, 2]:'hi'} # 리스트를 Key로 사용

"""
Traceback (most recent call last):
	File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
"""

Key에는 list를 쓸 수 없음 (↔ 튜플은 사용 가능)

  • 딕셔너리의 Key는 값이 변하냐 변하지 않냐에 달려 있음
  • list는 값이 변할 수 있기 때문에 Key로 사용 불가능 (형 오류 발생)

 

딕셔너리 관련 함수

Key 리스트 만들기(keys)

a = {'name':'pey', 'phone':'01123124', 'birth':'1118'}
a.keys()
### 출력 결과: dict_keys(['name', 'phone', 'birth'])

a.keys()는 딕셔너리 a의 key만 모아서 dict_keys 객체를 돌려줌

 

for k in a.keys():
	print(k)

### 출력 결과
### name
### phone
### birth

# dict_keys 객체를 리스트로 변환
list(a.keys()) ### 출력 결과 ['name', 'phone', 'birth']

dict_keys 객체는 리스트와 유사한 방식으로 사용

그러나 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없음에 유의

 

Value 리스트 만들기(values)

a.values()
### 출력 결과: dict_values(['pey', '01123124', '1118'])

Key를 얻는 것과 마찬가지로 Value만을 얻고자 할 땐, values 함수를 사용

→ dict_values 객체를 반환

 

Key, Value 쌍 얻기(items)

a.items()
### 출력 결과
### dict_items([('name', 'pey'), ('phone', '01123124'), ('birth', '1118')])

items 함수는 Key와 Value 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려줌

 

Key : Value 쌍 모두 지우기(clear)

a.clear()
print(a) ### 출력 결과: {}

clear 함수는 딕셔너리 안의 모든 요소를 삭제함

  • 비어 있는 딕셔너리를 만들고 싶을 때는 a = dict() 혹은 a = {}로 생성

 

Key로 Value 얻기(get)

a = {'name':'pey', 'phone':'01123124', 'birth':'1118'}
a.get('name') ### 출력 결과: 'pey'
a.get('phone') ### 출력 결과: '01123124'

get(x) 함수는 x라는 Key에 대응되는 Value 값을 반환

  • a.get('name')과 a['name']는 동일한 결과 값을 반환함
  • 하지만 a['nokey']와 같이 존재하지 않는 Key 값에 해당하는 Value를 가져오려 할 경우
    • a['nokey']는 KeyError를 발생
    • a.get('nokey')는 None을 반환

딕셔너리 안에 찾으려는 Key의 값이 없을 경우 미리 정해둔 디폴트 값을 대신 가져오게 하고 싶을 경우

→ get(Key, '디폴트 값')을 사용하면 편리함

 

해당 Key가 딕셔너리 안에 있는지 조사하기(in)

a = {'name':'pey', 'phone':'01123124', 'birth':'1118'}
'name' in a ### 출력 결과: True
'email' in a ### 출력 결과: False

존재하지 않는 Key 값에 접근할 경우 KeyError가 발생하므로 확인할 수 있는 방법이 필요함!

 

 

오류와 관련된 지적은 언제든 댓글로 달아주세요!

728x90

'알고리즘' 카테고리의 다른 글

[자료구조/Python] 해시(Hash), 해시테이블(Hash Table)  (1) 2024.01.10