python에서 key-value 구조를 가진 대표적인 자료구조가 dict 이다. sequencial 한 자료구조와 구분되어 필수적으로 사용되는데 이에 대해 깊이 살펴봤을 때 장단점을 더 잘 이해하고, 또 이를 극복한 파생된 dict 들을 공부할 수 있었다. 이러한 내용들을 정리해보고자 한다.
dict 의 기본 구조이기도 한 hash 구조에 대해 먼저 개념을 정리해보자
hash 주소 존재여부 : mutable한 구조는 값이 수정될 수 있으므로, hash주소를 가지지 않는다
# Hash 값 확인
t1 = (10, 20, (30, 40, 50))
t2 = (10, 20, [30, 40, 50])
print( hash(t1)) # 465510690262297113
# print(hash(t2)) # 에러발생
기본 dict 활용보다 속도가 빨라 대용량 데이터 처리에 많이 활용된다.
아래는 문장 내에서 word의 빈도를 계산할 때 Dict를 활용하는 간단한 코드이다.
word_counts = {}
# No use setdefault
for word in sentence:
word_counts.setdefault(word , 0)
word_counts[word] += 1
그런데, 매번 word가 key로서 존재하지 않을 때, default값인 0을 set해야하기 때문에 코드가 깔끔하지 않아보이는 면이 있다.
따라서 defaultdict 활용하면, 더 간결한 코드가 가능하다
from collections import defaultdict
word_counts = defaultdict(int) # 0으로 초기화 됨
# No use setdefault
for word in sentence:
word_counts[word] += 1
dict를 immuatble 하게 사용하고자 할 수도 있을 것이다. 이 때는 MappingProxyType 에서 기존 Dict를 인자로 받아준다면 frozen dict로 사용할 수 있다.
from types import MappingProxyType
d = {'key1': 'value1'}
# Read Only
d_frozen = MappingProxyType(d)
print(d is d_frozen, d == d_frozen) # False True
d_frozen['key1'] = 'value2' # 에러 발생 (수정불가)
Dict를 생성할 때 Comprehension도 많이 사용하지만, 중복 key가 존재할 경우는 특히나 Comprehension 사용하는 것을 지양해야한다. 왜냐하면 중복된 key의 value가 최근 value로 덮어쓰기 되어 이전 value가 담기지 않기 때문이다
source = (('k1', 'val1'),
('k1', 'val2'),
('k2', 'val3'),
('k2', 'val4'),
('k2', 'val5'))
new_dict3 = {k : v for k , v in source} # {'k1': 'val2', 'k2': 'val5'}
Deep, Shallow Copy (1) - 반복을 통한 List 생성 2가지 비교 (0) | 2022.04.28 |
---|---|
set, set comprehension, frozen set (0) | 2022.04.27 |
Comprehension (List, Dict), Generator (0) | 2022.04.25 |
NamedTuple (0) | 2022.04.20 |
Python 자료구조의 category (Sequence, Container, Flat, Mutable, Immutable) (0) | 2022.04.17 |
댓글 영역