카테고리 없음

딕셔너리(해시맵)

juwanseo 2025. 3. 16. 10:19

해시란?
입력으로 들어오는 값인 키를 어떤 값으로 변환한 결과이다. 이렇게 변환된 해시는 해시 맵에 '키 : 해시' 처럼 싸으로 저장된다. 해시 맵은 키와 해시를 저장하는 표이다. 이렇게 해시로 키를 변환해서 저장하게 되면, 동일한 키에 대해서 결과값을 빠르게 찾을 수 있기 때문에 장점이 생긴다.

파이썬에서의 해시
Dictionary
파이썬에서의 해시 함수는 딕셔너리로 구현되어 있다.

dictonary = {"key":"value"}



Defaultdict
딕셔너리는 존재하지 않는 키를 참조하려고 하면 에러가 발생하기 때문에, 키를 참조하기 전에 키가 존재하는지를 미리 확인해야만 한다.

temp = {"this":"yes"}
if "this" in temp:
    print(temp["this"])



코딩에서 이런 작업을 매번 해 주는 것이 매우 번거롭기 때문에, 키가 존재하지 않더라도 기본값을 넣어줄 수 있는 defaultdict를 사용하면 편리하다.

다음과 같이 collections 라이브러리에서 모듈을 불러올 수 있다.

from collections import defaultdict



defaultdict는 타입을 입력으로 받고 해당 타입의 기본값을 존재하지 않는 키의 기본값으로 사용한다. 예를 들어, int의 경우는 기본값이 0이다.

list타입의 경우는 비어 있는 리스트를 기본값으로 사용하고, dict타입은 비어 있는 딕셔너리를 기본값으로 사용한다.

Counter
Counter는 딕셔너리처럼 키와 밸류로 구성된 자료형으로, 딕셔너리와 거의 동일하게 사용할 수 있다. counter를 사용하면 원소별로 등장 횟수를 쉽게 셀 수 있다. 예를 들어, 다음과 같이 과일이 여러 번 들어 있는 리스트를 생각해볼수 있다.

fruits = ["oranges","pear","apple","apple","apple","pear"]

이 리스트로부터 각 과일이 몇 번 등장하는지를 딕셔너리를 이용해서 세려면 다음과 같습니다.

count = {}
for fruit in fruits:
	if fruit in count:
    	count[fruit] += 1
   	else:
    	count[fruit] = 1
print(count)

 

실행결과➡️ {'orange' : 1, 'pear' : 2 ,'apple' : 3}

 

방금 배운 defaultdict을 사용하면 더 간단합니다.

from collections import defaultdict

count = defaultdict(int)

for fruit in fruits:
	count[fruit] += 1

print(count)

 

여기서 counter를 사용하면 한 줄로도 가능합니다

from collections import Counter

count = Counter(fruits)
print(count)

 

이번에는 위에서 만든 딕셔너리 count를 빈도순으로 내림차순 정렬한 리스트 frequency를 만들어 보겠습니다. 여기서는 reverse=True를 써도 되지만 다음과 같이 더 간결하게 작성할 수 있습니다.

frequency = sorted(count.items(), key = lambda x: -x[1])
print(frequency)

 

만약 counter를 쓴다면 다음과 같이 할 수 있습니다.

count = Counter(fruits)
count.most_common()