본문 바로가기
C++,python (인프런+사이트)/python 파이썬 정리

딕셔너리 고급문법(hash table)

by 알 수 없는 사용자 2022. 4. 2.
  • 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()

 

 

댓글