반응형

1. Dict

  • tuple, dict 와 함께 정말 많이 쓰는 자료형 중 하나
  • 대표적인 hashtable

1) dict

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

dic1 = {}

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

dic1
>>> {'k1': ['val1', 'val2'], 'k2': ['val3', 'val4', 'val5']}

dic2 = {}
# Use setdefault
for k, v in source:
    dic2.setdefault(k, []).append(v)

dic2 
>>> {'k1': ['val1', 'val2'], 'k2': ['val3', 'val4', 'val5']}

dic은 기본적으로 key : value 형태로 있으며 각각의 키에 대한 중복을 허용하지 않습니다. 위와 같은 형태의 딕셔너리 타입 설정시 setdefault를 사용하는게 유리합니다.

2) 다양한 딕셔너리 형태

A. Read only(frozen)

  • 딕셔너리를 완전히 읽기전용으로 만들어 주는 패키지
  • 혹시라도 변경될 경우 심각한 문제를 초래하는 데이터에 사용하면 유용
  • types.MappingProxyType(dict)로 사용
# Read Only
d = {'key1': 'value1'}
d_frozen = MappingProxyType(d)

d_frozen['key1'] = 'value2'
>>> raise error

B. defaultdict

  • 현재 존재하지 않는 키를 입력해도 자동으로 만들어서 넣어주는 객체
  • callable한 객체는 모두 저장 가능 == 파이썬은 일급언어라 함수도 넣을 수 있습니다.
  • 원본을 대체(덮어쓰기)
  • collections.defaultdict() 로 사용
s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1

sorted(d.items())
>>> [('i', 4), ('m', 1), ('p', 2), ('s', 4)]

C. Chainmap

  • 다수의 딕셔너리 데이터가 있을때 병합과정을 지원한다. 이 때 단순히 다수의 딕셔너리를 합치는게 아니라, 다수의 딕셔너리가 포함된 튜플과 유사한 형태로 나타남
  • 엄밀히 말하면 딕셔너리 객체로 볼 수 는 없고 update의 역할을 수행하는데 보다 빠른 속도와 낮은 메모리 점유를 보여주기 때문에 다수의 딕셔너리 처리과정에 유용하게 쓰임
  • colletions.Chainmap()
a = {'music': 'woomin', 'art': 'godwoomin'}
b = {'art': 'yamani', 'blog': 'kyle'}

Chainmap(a,b)
>>> ChainMap({'music': 'woomin', 'art': 'godwoomin'}, {'art': 'yamani', 'blog': 'kyle'})

list(Chainmap(a,b))
>>> ['art', 'blog', 'music']

D. Orderdict

  • 순서가 저장되는 딕셔너리 형태로 매우 유용하게 사용
  • 순서 재배치도 가능(dict.move_to_end(key,last=''))
  • colletions.OrderDict()
c = colletions.OrderDict(a=1, b=2, c=3)
c
>>> OrderDict([('a',1),('b',2),('c',3)])
반응형
복사했습니다!