- Hash Table? 키(Key)에 데이터(Value)를 저장하는 데이터 구조
- Key를 통해 데이터를 바로 받아올 수 있음 → 속도가 획기적으로 빨라짐
- 파이썬 딕셔너리(Dictionary) 타입이 해쉬 테이블의 예 - Key를 가지고 바로 데이터(Value)를 꺼냄
- 보통 배열로 미리 Hash Table 사이즈만큼 생성 후 사용(공간과 탐색 시간을 맞바꾸는 기법)
- 파이썬에서는 해쉬를 별도로 구현할 필요 없음 - 딕셔너리 타입을 사용하면 되기 때문
쓰는 방법 :
t1 = (10,20,(30,40,50))
hash( t1 ) -> t1의 hash값이 생성 print(hash(t1))으로 찍어보기 가능
쓰는 이유 : 빠르다 데이터 검색할때
해시 테이블 :
Key와 Value를 사용하는 딕셔너리와 연관지어 설명해보자면
Key값을 해싱함수를 통해서 해쉬 주소값을 만들고 이 주소값을 이용해서 Key에 대한 Value의 위치를 알 수 있다.
만들어지는 과정 : Key -> 해싱함수 -> 해쉬주소 == Value 위치
Value를 찾는 과정 : Key -> 해쉬주소 -> Value 찾았다~!
코드
# Chapter04-03
# 파이썬 심화
# 시퀀스형
# 해시테이블(hashtable) -> 적은 리소스로 많은 데이터를 효율적으로 관리
# Dict -> Key 중복 허용 X, Set -> 중복 허용 X
# Dict 및 Set 심화
# Dict 구조
# print(__builtins__.__dict__)
print()
print()
# Hash 값 확인
t1 = (10, 20, (30, 40, 50))
t2 = (10, 20, [30, 40, 50])
#리스트는 Mutable 이기 때문에 Hash사용 불가능
print( hash(t1))
# print(hash(t2)) # 예외
print()
print()
# Dict Setdefault 예제
source = (('k1', 'val1'),
('k1', 'val2'),
('k2', 'val3'),
('k2', 'val4'),
('k2', 'val5'))
new_dict1 = {}
new_dict2 = {}
# No use setdefault
for k, v in source:
if k in new_dict1:
new_dict1[k].append(v)
else:
new_dict1[k] = [v]
print(new_dict1)
# Use setdefault
for k, v in source:
new_dict2.setdefault(k, []).append(v)
print(new_dict2)
# 주의 같은 Key값에 덮어 씌운다.
new_dict3 = {k : v for k , v in source}
print(new_dict3)
print()
print()
'C++,python (인프런+사이트) > python 파이썬 정리' 카테고리의 다른 글
Class로 구현하는 클로저 기능 (0) | 2022.04.03 |
---|---|
람다 맵 리듀스 필터 (0) | 2022.04.02 |
튜플 리스트 딕셔너리 차이 예제 (0) | 2022.04.02 |
튜플 고급 문법 (자주 쓰이는거 위주로 정리) (0) | 2022.04.02 |
Comprehending Lists으로 Generator 만들기 + 깊복,얕복 (0) | 2022.04.01 |
댓글