파이썬 알고리즘

딕셔너리

Suhd 2023. 4. 18. 22:19

딕셔너리

key와 value로 이루어진 딕셔너리

파이썬 3.7+ 부터 입력 순서가 유지됨

내부적으로 해시 테이블(11장에서 자세히 소개)로 구현되어 있다.

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

분활 상환 분석에 따른 시간 복잡도는 O(1)

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

collections 모듈은 다양한 기능들을 지원 (앞으로 많이 사용)

  • collections.defaultdict() : 항상 디폴트 값을 생성해 키 오류를 방지
  • collections.Counter() : 요소의 값→키 , 요소의 개수→값 형태로 만들어 카운팅

딕셔너리 활용 방법

  • 오류
>>> a = {'key1':'value1','key2':'value2'}
>>> a['key3']='value3'
>>> a
{'key1':'value1','key2':'value2','key3':'value3'}

존재하지 않는 key를 조회할 경우 KeyError 발생 → try구문으로 예외처리

try:
    print(a['key4'])
except KeyError:
    print('존재하지 않는 키')

존재하지 않는 키를 삭제할 때도 발생

try를 사용한 예외 처리 방법 외에도 if else를 통한 key가 존재하는지 아닌 지를 미리 확인 가능

  • .items()
for k,v in a.items():
    print(k,v)

와 같은 형식으로 key와 value를 각각 꺼내올 수 있다.

  • del
del a['key1']

del를 사용하면 리스트와 비슷하게 해당 key와 value가 삭제된다.

리스트 del 과 비교 ⇒ del a[i] : i번째 index에 해당하는 요소를 삭제


딕셔너리 모듈

특수한 형태의 컨테이너 자료형인 defaultdict,Counter,OrderedDict에 대해 살펴본다.

  • defaultdict 객체

존재하지 않는 키를 조회할 경우, 에러 메시지를 출력하는 대신

default 값을 기준으로 해당 키에 대한 딕셔너리 아이템을 생성

>>> a = collections.defaultdict(int)
>>> a['A']=5
>>> a['B']=4
>>> a
defaultdict(<class 'int'>, {'A':5,'B':4)}
>>> a['C']+=1
>>> a
defaultdict(<class 'int'>, {'A':5,'B':4,'C':1)} # collections.defaultdict 클래스

defualt 값인 0을 기준으로 자동으로 생성 후에 +1 연산을 한 뒤

key가 ‘C’인 Value에 0+1 =1 을 전달한다.

인자에 해당하는 자리에 여러 자료형 int,float와 같은 자료형을 넘어

list,set과 같은 자료구조도 사용 가능하다.

해당 자료형,자료구조의 형태로 새로운 key에 대한 빈 value를 default로 만들어 주는 것이다!

  • Counter 객체

아이템에 대한 개수를 계산해 딕셔너리로 반환

>>> a=[1,2,3,4,5,5,5,6,6]
>>> b=collections.Counter(a)
>>> b
Conter({5:3,6:2,1:1,2:1,3:1,4:1}) # collections.Counter 클래스
  • 가장 빈도수가 높은 요소 추출 ⇒ most_common(top_k)
>>> b.most_common(2)
[(5,3),(6,2)]
  • OrderedDict 객체

대부분의 언어에서 해시 테이블을 이용한 자료형은 입력 순서가 유지되지 않는다.

파이썬 3.6 이하에서도 마찬가지였기 때문에

입력 순서가 유지되는 OrderdDict이라는 별도의 객체를 제공

>>> collections.OrderedDict({'banana':3, 'apple':4,'pear':1,'orange':2})
OrderedDict([('banana':3), ('apple':4),('pear':1),('orange':2)])

그러나 파이썬 3.7부터 딕셔너리는 내부적으로 인덱스를 이용하여 입력 순서가 유지된다.

하지만, 코딩 테스트 당시 3.6 이하를 쓸 경우 입력 순서가 유지되지 않을 수 있다는 것 주의!

'파이썬 알고리즘' 카테고리의 다른 글

파이썬 리스트 구조  (0) 2023.04.18
자료형, 자료구조, 추상 자료형  (0) 2023.04.18
빅 오 표기법  (0) 2023.04.18
파이썬 문법 기본  (0) 2023.04.18