Programming/Python

[Python] Hash 자료형(사전 자료형) 정리

킹우현 2023. 10. 5. 16:06

1) Hash 자료형 정리

파이썬에서는 Dictionary 라는 자료구조를 통해 해시를 제공합니다. 그리고 Dictionary dict 클래스에 구현되어있습니다.

 

해시 자료형은 다음과 같은 상황에서 사용할 수 있습니다.

  1. 리스트를 쓸 수 없을 때 (인덱스 값을 숫자가 아닌 다른 값 문자열이나 튜플을 사용하려고 할 때)
  2. 빠른 접근 / 탐색이 필요할 때  ⭐️
  3. 집계가 필요할 때(해시와, collections 모듈의 Counter 클래스를 사용)

2) 딕셔너리와 리스트의 시간 복잡도 차이

List에 비해 Dictionary가 매우 빠른 시간복잡도를 갖는 것을 보실 수 있습니다. 즉 , 원소를 넣거나 삭제, 탐색할 일이 많을 때에는 딕셔너리를 사용하는 것이 좋습니다.

 

3) 딕셔너리 사용법

3-1) 선언

# 빈딕셔너리 생성
dict1 = {} # {}
dict2 = dict() # {}
# 특정 key-value쌍을 가진 dictionary 선언

Dog = {
    'name': '동동이',
    'weight': 4,
    'height': 100,
}


'''
{'height': 100, 'name': '동동이', 'weight': 4}
'''

{}를 사용하거나 dict함수 호출 시 빈 딕셔너리를 선언할 수 있습니다. key - value 쌍을 갖는 dictionary 선언도 바로 가능합니다

 

3-2) value 값 가져오기(Get)

# [] 기호 사용해 원소 가져오기

dict = {'하이': 300, '헬로': 180, 3: 5}
dict['헬로'] # 180

Dictionary에서 원소를 가져오는 방법은 두 가지 입니다.

  1. [] 사용하기
  2. get 메소드 이용하기
# get 메소드를 아용해 원소 가져오기 1
# 딕셔너리에 해당 key가 없을때 Key Error 를 내는 대신, 특정한 값을 가져온다.

dict = {'하이': 300, '헬로': 180}
dict.get('동동', 0) # 0
# get 메소드를 아용해 원소 가져오기 2
# 물론, 딕셔너리에 해당 key가 있는 경우 대응하는 value를 가져온다.

dict = {'하이': 300, '헬로': 180}
dict.get('헬로', 0) # 180

get 메소드는 get(key,x) 로 사용하실 수 있습니다. 이는 '딕셔너리에 key가 없는 경우, x를 리턴해줘라'라는 용도입니다.

👉🏻 []를 사용하면 찾고자하는 key 값이 없을 경우 바로 KeyError 를 발생시키지만 get() 메소드를 사용하면 존재하지 않은 key 에 대해 예외를 던지지 않고 none 을 리턴하기 때문에 에러를 피할 수 있다. ⭐️⭐️⭐️

 

3-3) 값 저장 및 업데이트(Set)

# 값 집어넣기

dict = {'김철수': 300, 'Anna': 180}
dict['홍길동'] = 100
dict #{'Anna': 180, '김철수': 300, '홍길동': 100}
# 값 수정하기1

dict = {'김철수': 300, 'Anna': 180}
dict['김철수'] = 500
dict # {'Anna': 180, '김철수': 500}
# 값 수정하기2

dict = {'김철수': 300, 'Anna': 180}
dict['김철수'] += 500
dict # {'Anna': 180, '김철수': 800}

딕셔너리에 값을 집어넣거나, 값을 업데이트 할 때 [ ] 를 사용합니다.

 

3-4) 값 삭제(Delete)

# del 이용하기 - 키가 있는 경우
dict = {'김철수': 300, 'Anna': 180}
del dict['김철수']

dict #{'Anna': 180}
# del 이용하기 - 키가 없는 경우 raise KeyError
my_dict = {'김철수': 300, 'Anna': 180}
del my_dict['홍길동'] 
'''
keyError 발생!
'''
# pop 이용하기 - 키가 있는 경우 대응하는 value 리턴
my_dict = {'김철수': 300, 'Anna': 180}
my_dict.pop('김철수', 180) # 300
# pop 이용하기 - 키가 없는 경우 대응하는 default 리턴
my_dict = {'김철수': 300, 'Anna': 180}
my_dict.pop('홍길동', 180) # 180

딕셔너리에서 특정 key 값을 지울 때에 다음과 같은 방법을 사용할 수 있습니다.

  1. del dict_obj[key] : del은 키워드로써, 만약 딕셔너리에 key가 없다면 keyError가 발생합니다.
  2. pop(key[,default]) : pop은 메소드로써, pop메소드는 key 값에 해당하는 value를 리턴합니다. key가 없다면 두번째 파라미터인 default를 리턴합니다.(만약 default 설정하지 않았을 시엔 keyError가 발생합니다.)

3-5) 순회(Iterate)

# key로만 순회
dict = {'김철수': 300, 'Anna': 180}
for key in dict:
    print(key)
    # 이 경우 value를 찾고 싶으면 dict[key] 와 같이 접근을 따로 해주어야.

'''
김철수
Anna
'''
# key-value 동시 순회

dict = {'김철수': 300, 'Anna': 180}
for key, value in dict.items():
    print(key, value)

'''
김철수 300
Anna 180
'''

딕셔너리를 for문을 이용하여 조회할 때 두가지 방법이 존재합니다.

  1. key로만 순회하기
  2. key, value 동시 순회하기 (items() 사용)

그 외 딕셔너리 Tip

1) 특정 key가 딕셔너리에 있는지 없는지 조회할 때 - in 사용하기

dict = {'김철수': 300, 'Anna': 180}
print("김철수" in dict) #True
print("김철수" not in dict) # False

2) key 또는 value만 뽑아내는 방법

# key를 extract - keys 사용

my_dict = {'김철수': 300, 'Anna': 180}
my_dict.keys() # dict_keys(['김철수', 'Anna'])
# value를 extract - values 사용

my_dict = {'김철수': 300, 'Anna': 180}
my_dict.values() # dict_values([300, 180])
# key, value 쌍을 extract - items 사용

my_dict = {'김철수': 300, 'Anna': 180}
my_dict.items() # dict_items([('김철수', 300), ('Anna', 180)])

참고 : https://yunaaaas.tistory.com/m/46

 

[Python 자료구조] Hash(해시)

파이썬에서 해시(Hash)는 어떻게 구현할 수 있을까요!? 파이썬에서는 Dictionary 라는 자료구조를 통해 해시를 제공합니다. 그리고 Dictionary는 dict클래스에 구현되어있습니다! 해시 언제 사용하면 좋

yunaaaas.tistory.com