본문 바로가기
Python/기초

파이썬 강사가 정리한 파이썬 딕셔너리 A to Z 모든 것

by 모두의 케빈 2023. 8. 23.

 

 

목차(Content)

 

딕셔너리 자료형

 > 파이썬 딕셔너리: 키와 값으로 이루어진 컬렉션 자료형

 > 딕셔너리는 어디에 활용될까?

 > 딕셔너리 선언하기

 > 딕셔너리 인덱싱

 

딕셔너리 구성 요소: item

 > 딕셔너리 item 불러오기

 > 딕셔너리 key 값만 or value 값만 불러오기

 > 딕셔너리 활용: for문과 함께 사용하기

 

파이썬 딕셔너리 값 추가, 수정, 삭제하기

 > 추가

 > 수정

 > 삭제

 

리스트와 딕셔너리

 > 리스트로 딕셔너리 만들기

 

+ 기타 관련 글(딕셔너리가 빠른 이유: hashtable 구조) 

 

 

 

 

딕셔너리 자료형


 

파이썬 딕셔너리 한 글로 정리하기

 

 

파이썬 딕셔너리: 키와 값으로 이루어진 컬렉션 자료형

 

딕셔너리(dictionary)는 사전이라는 의미입니다. 파이썬에서 key와 value 값을 1:1로 맵핑하여 마치 사전처럼 보관하는 유형의 자료형을 딕셔너리 자료형이라고 합니다.

 

딕셔너리 자료형에서 key는 value 값을 찾기 위한 검색 인덱스 기능을 합니다. 따라서 key 값은 고유(Unique) 해야 합니다. 그러나 key와 맵핑된 value 값은 여러 개가 있어도 됩니다.

 

딕셔너리도 set과 마찬가지로 hashtable 구조를 채택하고 있어서 특정 원소가 있는지를 검사하는 in과 같은 연산에서 리스트 대비 속도가 빠른 편입니다. (셋 자료형이 딕셔너리 자료형을 본떠서 만들어졌다고 하네요.)

 

hashtable 구조의 자세한 원리와 설명에 대한 글의 링크는 본문 맨 아래에 첨부해 두었으니, 관심 있으신 분들은 참고해 주세요.

 

 

딕셔너리는 어디에 활용될까?

 

딕셔너리는 key:value 쌍으로 구성할 수 있는 다양한 곳에서 활용됩니다.

 - 이름 : 전화번호

 - 인공 신경망의 파라미터 : 값

 - A 그룹원들의 나이: [29,30,26,....]

 - key 값을 컬럼(열) 이름, value 값을 컬럼(열)의 값으로 하는 DataFrame 만들 때

 

 

딕셔너리 선언하기

 

딕셔너리는 중괄호 안에 key와 value를 콜론(:)으로 관계를 맺으며 선언합니다.

dict_a = {'이름':'취미로 코딩하는 남자', '취미': '코딩'}
print(type(dict_a))
 >>>>> 실행 결과: <class 'dict'>

 

공백의 비어있는 딕셔너리는 아래와 같이 선언합니다.

# 공백 딕셔너리 선언

dict_a = {}
dict_a = dict()

 

 

딕셔너리 인덱싱

 

딕셔너리의 인덱싱은 대괄호 안에 key 값을 넣어서 value를 출력하는 방식으로 작동합니다.

# 딕셔너리 인덱싱

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a['이름']

 >>>>> 실행 결과: '취미로 코딩하는 남자'

 

안타깝게도, 딕셔너리 역시 hashtable 구조이므로 순서의 개념이 없습니다. 따라서 슬라이싱은 사용할 수 없습니다.

 

 

 

 

딕셔너리의 구성 요소: Item


딕셔너리 item 불러오기

 

딕셔너리는 key와 value로 구성되어 있고 이 둘을 딕셔너리의 구성 요소라고 하여 item이라고 총칭합니다. 딕셔너리의 key와 value를 tuple 형태로 함께 묶어서 호출하고 싶다면 item() 메서드를 활용하면 됩니다.

 

# item() 메서드

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
print(dict_a.items())

 >>>>> 실행 결과
 dict_items([('이름', '취미로 코딩하는 남자'), ('취미', '코딩'), ('국적', '한국인')])

 

 

딕셔너리 key 값만 or value 값만 불러오기

 

딕셔너리의 key 값만 호출하고 싶다면 key() 메서드를, value 값만 호출하고 싶다면 values() 메서드를 사용하면 됩니다. 두 메서드 모두 결과값은 리스트로 반환합니다.

 

# keys(), values() 메서드

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
print(dict_a.keys())
print(dict_a.values())

 >>>>> 실행 결과
dict_keys(['이름', '취미', '국적'])
dict_values(['취미로 코딩하는 남자', '코딩', '한국인'])

 

 

딕셔너리 활용: for문과 함께 사용하기

 

딕셔너리 자료형은 for문과 함께 자주 사용됩니다. 딕셔너리의 구성 요소를 for문으로 각각 접근하여 사용하기 좋기 때문입니다.

 

딕셔너리와 for문을 함께 사용하는 것은 어렵지 않습니다. 위의 구성 요소를 불러오는 items(), keys(), values() 세 가지 메서드만 잘 기억하시면 됩니다.

 

 

먼저 items() 메서드와 for문을 사용해 보겠습니다. items() 메서드는 (key, value) 튜플 형태로 결과값을 반환하기 때문에 for문을 사용할 때 2개의 변수(key, value)가 필요합니다.

# items() 메서드의 실행 결과는 (key, value) 튜플의 형태

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}


for key, value in dict_a.items():
    print(key, value)
    
 >>>>> 실행 결과
이름 취미로 코딩하는 남자
취미 코딩
국적 한국인

 

 

keys() 메서드와 for문 또는 items() 메서드와 for문은 사용 방법이 동일합니다. 두 메서드 모두 결과를 리스트로 반환하기 때문에 리스트와 for문을 사용한다고 생각하시면 편합니다.

# keys() 메서드의 실행 결과는 리스트

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}


for key in dict_a.keys():
    print(key)
    
 >>>>> 실행 결과
이름
취미
국적

 

# values() 메서드의 실행 결과는 리스트

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}


for value in dict_a.values():
    print(value)
    
 >>>>> 실행 결과
취미로 코딩하는 남자
코딩
한국인

 

 

파이썬 딕셔너리 값 추가, 수정, 삭제하기


딕셔너리에 새로운 값을 추가하려면 key와 value를 함께 추가해 주셔야 합니다. 추가할 때 형태는 인덱싱과 유사한데, 이때 중요한 건 key 값은 중복되면 안 됩니다.

 

 

딕셔너리 값 추가하기

 

딕셔너리에 값을 추가하는 방법은 dictionary[새로운 key값] = 새로운 value값의 형태로 추가합니다.

# 딕셔너리 값 추가

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}

dict_a['좋아하는 음식'] = '마라탕'
print(dict_a)
 >>>>> 실행 결과
{'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인', '좋아하는 음식': '마라탕'}

 

 

새로운 key 값을 추가하고 싶은데, 값을 모르겠을 때는 setdefault() 메서드를 활용할 수 있습니다. 이 경우, key 값을 생성하면 value 값을 None으로 저장합니다.

# key 값만 추가하고 싶을 때

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a.setdefault('일정')
print(dict_a)
 >>>>> 실행 결과
{'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인', '일정': None}

 

위의 방법은 아래와 동일한데요, 둘 중 편하신 방법을 사용하시면 됩니다. 참고로 저는 아래 방식을 선호합니다.

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a['일정'] = None

 

 

 

 

만약 key 값이 중복된다면, 이전의 정보는 새로운 정보로 ‘덮어쓰기’되니 주의해 주세요.

# key 값은 유니크해야 한다.

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a['취미'] = ['영화','넷플릭스','유튜브']
print(dict_a)
 >>>>> 실행 결과
{'이름': '취미로 코딩하는 남자', '취미': ['영화', '넷플릭스', '유튜브'], '국적': '한국인'}

 

 

딕셔너리 값 수정하기

 

딕셔너리의 key의 값(value)을 수정하고 싶을 때는, 기존의 key 값으로 호출하고 value 값을 덮어쓰면 됩니다. 

# value 수정: '취미로 코딩하는 남자' → ['취코남','케빈']

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a['이름'] = ['취코남','케빈']
print(dict_a)

 >>>>> 실행 결과
{'이름': ['취코남', '케빈'], '취미': '코딩', '국적': '한국인'}

 

 

물론 아래와 같이 update() 메서드를 활용할 수도 있습니다. update 메서드를 활용할 때, key 값이 문자이더라도 따옴표를 사용하지 않습니다.

# update() 메서드

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a.update(이름 = ['취코남','케빈'])

dict_a
 >>>>> 실행 결과
{'이름': ['취코남', '케빈'], '취미': '코딩', '국적': '한국인'}

 

 

update() 메서드는 여러 값을 수정할 때 유용하게 사용할 수 있습니다.

# update() 메서드로 여러 개의 값 수정

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a.update(이름 = '취코남', 취미 = '영화')

dict_a
 >>>>> 실행 결과
{'이름': '취코남', '취미': '영화', '국적': '한국인'}

 

 

딕셔너리 값 삭제하기

 

딕셔너리의 key와 value를 제거하기 위해서는 del 명령어를 활용하면 됩니다.

# key-value 제거

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
del dict_a['이름']

dict_a
 >>>>> 실행 결과:
{'취미': '코딩', '국적': '한국인'}

 

 

또는 pop() 메서드를 사용할 수 있습니다. 리스트와 다르게 순서가 없으므로, 소괄호 안에 반드시 key 값을 명시해야 합니다.

# pop() 메서드

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}

print(dict_a.pop('이름'))
print(dict_a)

 >>>>> 실행 결과
취미로 코딩하는 남자
{'취미': '코딩', '국적': '한국인'}

 

 

popitem() 메서드는 가장 마지막에 추가한 딕셔너리 인자를 pop 할 수 있습니다.

# popitem() 메서드

dict_a = {'이름': '취미로 코딩하는 남자', '취미': '코딩', '국적': '한국인'}
dict_a['마지막 추가'] = None
print(dict_a.popitem())

 >>>>> 실행 결과
('마지막 추가', None)

 

 

 

 

리스트와 딕셔너리 

리스트로 딕셔너리 만들기

 

딕셔너리는 분명 유용한 자료형이지만 key와 value를 모두 선언하기 귀찮은 건 사실입니다. 

 

그래서 딕셔너리 자료형을 선언하는 편리한 방법들이 몇 가지 있는데요. 그중 가장 대표적으로 사용되는 방법은 두 개의 리스트로 딕셔너리를 만드는 것입니다. 물론 이때, 두 리스트의 길이는 동일해야 합니다.

 

우선 두 개의 리스트를 만들어 보겠습니다.

# 두 개의 리스트

alphabets = list('abcdefg')
print(alphabets)

numbers = list(range(1,8))
print(numbers)

 >>>>> 실행 결과
['a', 'b', 'c', 'd', 'e', 'f', 'g']
[1, 2, 3, 4, 5, 6, 7]

 

 

이제 이 두 개의 리스트를 zip 함수로 묶어서 딕셔너리로 형 변환을 해보겠습니다.

new_dict = dict(zip(alphabets, numbers))
new_dict

 >>>>> 실행 결과
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7}

 

이때, 앞의 리스트가 key 값이 되고 뒤의 리스트가 value 값이 되니 순서에 신경 써주시면 됩니다. 코드에 익숙하다면, 하나씩 손으로 작성하는 것보다 훨씬 빠르게 선언할 수 있습니다.

 

 

 

 

 

hashtable 구조에 대하여

 

파이썬 셋, 딕셔너리: hashtable 구조에 대하여

 

 

 

댓글