본문 바로가기
Programming 💻/Python

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

by 킹우현 2023. 10. 5.

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