Python/파이썬 심화

파이썬 시퀀스 (6)

monstro 2025. 8. 12. 14:04
728x90
반응형

- 개요

파이썬의 시퀀스 중에서 Key와 Value 구조로 값을 저장하는 시퀀스들이 존재한다

대표적으로 딕셔너리와 Set을 예시로 들 수 있는데, 해당 시퀀스들은 해시 테이블을 기반으로 설계되었다

해시 테이블Key에 Value를 저장하는 구조로 Key 값의 연산 결과에 따라 직접 접근이 가능하다

Key 값해싱 함수에 인자로 사용하여 해시 주소를 반환하고, 반환된 해시 주소를 통해 Value에 접근이 가능하다

 

따라서 해시 테이블과 관련하여 알아본다

 

1) hash 함수를 통한 해시값 확인

t1 = (10, 20, (30, 40, 50))
t2 = (10, 20, [30, 40, 50])

print(hash(t1))
print(hash(t2))

 

위와 같이 2개의 튜플을 생성한다

t1의 경우 중첩된 튜플 구조이고, t2의 경우 리스트가 포함된 튜플 구조이다

이때 hash 함수를 사용하면 해당 컨테이너의 해시값을 반환한다

 

t1의 해시값 출력
t2의 해시값 출력 - 예외 발생

 

실행한 결과 t2에서는 해시값을 가져올 수 없는 것을 확인할 수 있다

이러한 이유는 mutable 시퀀스는 해시 테이블로 구현되지 않기 때문이다

그러므로 해시immutable 시퀀스에서만 사용이 가능하다

 

2) 해시 테이블의 기능을 활용하는 함수 : setdefault

파이썬의 setdefault 함수는 딕셔너리와 연관지어 사용할 수 있는 함수이다

  • 딕셔너리에서 특정 Key 존재하지 않는 경우 : 해당 Key와 함께 기본값을 추가
  • 키가 이미 존재하는 경우 : 해당 키의 값을 반환

setdefault 함수를 사용하여 컨테이너들을 손쉽게 딕셔너리로 변환하는 것이 가능하다

 

2 - 1) setdefault 함수를 사용하지 않는 경우

source = (('k1', 'val1'),
          ('k1', 'val2'),
          ('k1', 'val3'),
          ('k2', 'val4'),
          ('k2', 'val5'))

new_dict1 = {}

for k, v in source:
    if k in new_dict1:
        new_dict1[k].append(v)
    else:
        new_dict1[k] = [v]

print(new_dict1)

 

setdefault 함수를 사용하지 않는 경우 위와 같이 조건문을 추가하여 Key가 이미 존재하는지 판단해야 한다

실행 결과는 다음과 같다

 

 

의도한 대로 튜플이 딕셔너리로 문제없이 변환되었다

 

2 - 2) setdefault 함수를 사용하는 경우

source = (('k1', 'val1'),
          ('k1', 'val2'),
          ('k1', 'val3'),
          ('k2', 'val4'),
          ('k2', 'val5'))

new_dict2 = {}

for k, v in source:
    new_dict2.setdefault(k, []).append(v)

print(new_dict2)

 

2 - 1)과 다르게 로직이 매우 간단해지는 것을 확인할 수 있다

setdefault 함수의 인자로 Key와 Value를 지정해야 하는데,

코드에서는 Value빈 배열을 주고 append를 통해 배열에 을 추가한다

실행 결과는 다음과 같다

 

 

마찬가지로 튜플이 딕셔너리로 문제없이 변환된 것을 확인할 수 있다

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

일급 함수의 특징 (1)  (0) 2025.08.12
파이썬 시퀀스 (7)  (0) 2025.08.12
파이썬 시퀀스 (5)  (0) 2025.08.07
파이썬 시퀀스 (4)  (0) 2025.08.07
파이썬 시퀀스 (3)  (0) 2025.08.05