알고리즘

[Python] 딕셔너리

홍팡 2022. 11. 22. 20:20

파이썬의 딕셔너리는 

키 - 값

구조로 이루어진 형태의 자료형을 말한다.

파이썬 3.7 + 이후 버전에서는 입력 순서가 유지되며, 내부적으로 해시 테이블로 구현되어 있다.

 

 

※ 해시 테이블
해시 테이블이란 해시함수를 사용하여 변환한 값을 색인(index)으로 삼아 키(key)와 데이터(value)를 저장하는 자료구조를 말한다.

 

 

 

 

인덱스를 숫자로만 지정할 수 있는 리스트와 달리 딕셔너리는 문자를 포함해 다양한 타입을 키로 사용할 수 있다.

특힌 파이썬의 딕셔너리는 해시할 수만 있다면 숫자, 문자, 집합까지 불변 객체들을 모두 키로 사용할 수 있다.

무엇보다 해시 테이블은 다양한 타입을 키로 지원하면서도 입력과 조회 모두 O(1) 에 가능하다.

 

연산 시간 복잡도 설명
len(a) O(1) 요소의 개수를 리턴한다.
a[key] O(1) 키를 조회하여 값을 리턴한다.
a[key] = value O(1) 키/값을 삽입한다.
key in a  O(1) 딕셔너리에 키가 존재하는지 확인한다.

 

원래 딕셔너리에서는 입력순서가 유지되지 않아 (대부분의 해시 테이블을 이용한 자료형은 입력 순서가 유지되지 않음)

collections.OrderedDict() 라는 자료형을 사용하곤 했었지만

3.7 이후 버전부터는 내부적으로 인덱스를 이용해 입력 순서를 유지하도록 개선되었다.

 

순서를 유지하는 collections.OrderedDict() 외에도,

없는 요소를 조회 시 디폴트 값을 생성해 오류를 방지하는 collections.defaultdict(),

요소의 값을 키로 하고 개수를 값 형태로 만들어 카운팅하는 collections.Counter() 등이 있다.

 

 

 

 

딕셔너리 활용

 

 

  • 딕셔너리 선언
a = dict()
a = {}

 

 

  • 초기값 선언, 값 할당
a = {'key1' : 'value1', 'key2' : 'values2'}
a['key3'] = 'value3'
a['key1'] : 'value1'

 

초기에 위와 같은 형태로 a라는 딕셔너리에 값을 할당하거나

딕셔너리가 생성된 후에 아래와 같은 형태로 키-값 을 새로 할당하여줄 수가 있다.

 

이미 생성된 키에 대해서 

a['key1']은 value1 이라는 값이 있기 때문에 

a['key1'] 은 value1을 조회하고

 

a['key1'] = 'value4'

만약 key1에 새로운 값을 할당하고 싶을 때는 새로운 값을 넣어주면 된다.

 

 

 

 

  • 값 제거

할당되어 있는 키를 제거하기 위해서 del를 사용한다.

del a['key1']

 

a의 key1 이라는 키값 삭제

 

 

 

 

  • 존재하지 않는 키 조회

a 딕셔너리에서 key4란 키는 존재하지 않기 때문에 

key4를 조회할 시 오류가 발생한다.

a['key4']
Traceback (most recent call last):
	File "<stdin>", line1, in <module>
KeyError : 'key4'

 

(위에서 서술했듯이 이런 상태의 상황을 피하고 싶을 때는 defaultDict를 사용한다.)

 

 

 

 

  • 딕셔너리의 길이 조회
len(a)

 

딕셔너리의 길이는 key 값을 기반으로 조회를 하게된다.

value 값이 아무리 많아도 key로 인해 길이가 결정

 

 

 

 

  • 특정 키 확인

딕셔너리 안에 특정 키가 있는지 확인하기 위해서는

'key1' in a

 

in 이라는 메서드를 사용하는데

in은 딕셔너리 뿐 아니라 리스트나 문자열에서도 자주 사용되므로 알아두자.

 

key1이 a 안에 있으면 True, 없으면 False를 리턴한다.

 

 

 

 

 

  • keys(), values(), items()

딕셔너리를 이용할 때 키만 이용하고 싶을 때도, 값만 이용하고 싶을 때도, 키값쌍 모두 이용하고 싶을 때도 있을 것이다.

그럴 경우에는 keys(), values(), items() 라는 메서드를 사용하면 되는데

 

keys() : key에 대해서만 접근

values() : value에 대해서만 접근

items() : key-value에 대해서 접근

 

for k in a.keys():
	print(k) # a 딕셔너리의 key 값들 출력
for v in a.values():
	print(v) # a의 value 값 출력
for k,v in a.items():
	print(k, v)

 

 

 

 

 

  • 딕셔너리 병합

여러 개의 사전을 합쳐야 할 때 ** 연산자나 | 연산자를 사용하여 합칠 수 있다.

 

dic1 = {'A' : 10, "B": 'banana'}
dic2 = {'B': 'apple', "C": 60}
{ **dic1 , **dic2 }
dic1 | dic2

 

만약 합치려는 딕셔너리에 같은 키가 공존할 경우 뒤에 더해지는

즉, 여기서는 dic2의 값으로 딕셔너리가 병합된다.

 

 

 

update라는 메서드도 있는데 

dic1.update(dic2) 이런 형식으로 사용하는데

기능은 딕셔너리 병합과 거의 비슷하니 궁금한 사람들은 찾아보길 바란다.