3.4 융통성 있게 키를 조회하는 매핑

 

Remarks

이 글은 전문가를 위한 파이썬(Fluent Python)을 정리한 자료입니다.


3.4 융통성 있게 키를 조회하는 매핑

3.4.1 defaultdict: 존재하지 않는 키에 대한 또 다른 처리

1
2
3
4
5
6
from collections import defaultdict


dic = defaultdict(list)  # int
dic[0]    # {0: []}
dic['1']  # {0: [], '1': []}
  1. 매핑형은 __missing__()을 통해 존재하지 않는 키를 처리한다.

3.5 그 외 매핑형

  1. collections.OrderedDict 키를 삽입한 순서대로 유지함으로써 항목을 반복하는 순서를 예측할 수 있다.

  2. collections.ChainMap 매핑들의 목록을 담고 있으며 한꺼번에 모두 검색할 수 있다. 각 매핑을 차례대로 검색하고, 그중 하나에서라도 키가 검색되면 성공한다.

    import buildins
    pylookup = ChainMap(locals(), globals(), vars(builtins))
    
  3. collections.Counter 모든 키에 정수형 카운터를 갖고 있는 매핑. 기존 키를 갱신하면 카운터가 늘어난다.

    ct = collections.Counter('abracadabra')
    ct                 # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
    ct.update('aaaaazzz')
    ct                 # Counter({'a': 10, 'z': 3, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
    ct.most_common(2)  # [('a', 10), ('z', 3)]
    ct['a']            # 10
    

3.6 UserDict 상속하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from collections import UserDict


class StrKeyDict(UserDict):
  def __missing__(self, key):
    if isinstance(key, str):
      raise KeyError(key)
    return self[str(key)]
  
  def __contains__(self, key):
    return str(key) in self.data
  
  def __setitem__(self, key, item):
    self.data[str(key)] = item

3.7 불변 매핑

1
2
3
4
5
6
7
8
9
10
from types import MappingProxyType

d = {1: 'A'}
d_proxy = MappingProxyType(d)
d_proxy  # {1: 'A'}

d_proxy[2] = 'x'  # raise error

d[2] = 'B'
d_proxy  # {1: 'A', 2: 'B'}