매핑

매일 공부(ML)·2022년 11월 12일
0

Fluent Python

목록 보기
15/130

데이터 구조체

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

검색할 때 키가 존재하지 않을 때 특별한 값을 반환하는 매핑이 있으면 편리한 경우들이 있고 이를 만드는 것은 두 가지가 있다. 첫 번째, 평벙한 dict대신 defaultdict를 사용하는 방법이고 다른 하나는 dict등의 매핑형을 상속해서 missing()메서드를 추가하는 방법입니다.

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

defaultdict 객체를 생성할 때 존재하지 않는 키 인수로 getitem() 메서드를 호출할 때마다 기본값을 생성하기 위해서 사용되는 콜러블을 제공하는 것이다.

#index_default.py: setdefault() 메서드 대신 defaultdict 객체 사용하기

"""
default_factory 에 list 생성자를 갖고 있는 defaultdict를 생성한다.
f) word가 index에 들어 있지 않으면 default_factory를 호출해서 없는 값에 대한 항목을 생성하는데, 

여기서는 빈 리스트를 생성해서 index[word] 에 할당한 후 반환하므로, append (location ) 연산은 언제나 성공한다.

"""
"""단어가 나타나는 위치를 가리키는 인덱스를 만든다."""
import sys
import re
import collections
WORD_RE = re . compile ( r ' \w+ ' )
index = collections . defaultdict( list ) O
with open(sys_argv[1 ], encoding='utf-8' ) as fp:
	for line_no, line in enumerate(fp, 1):
		for match in WORD_RE.finditer(line):
			word = match.group()
			column_no = match . start ()+1
			location = (line_no, column_no)
			index[word] .append(location) @
#알파벳순으로 출력한다.
for word in sorted(index, key=str.upper):
print(word, index[word])

defaultfactory가 설정되지 않고, 키가 없을 때 흔히 볼 수 있는 KeyError가 발생한다.

defaultdict 의 default_factory는 _getitem
( ) 호출에 대한 기본값을 저居하기 위
해 호출되며, 다른 메人七三를 통해人눈근 호출되지 않는다. 여層 들어 dd 가 defaultdict 형이며, k가 존재하지
않는 키면, dd[k]는 default_factory를 호출해서 기본값을 생성하지만, dd,get(k)는 단저 None을 반환
할뿐01다.


missing()메서드

매핑형은 이름으로도 쉽게 추측할 수 있는 missing() 메서드를 이용헤서 존재하지 않는 키를 처리하고 특수 메서드는 기본 클래스인 dict에는 정의되어 있지 않지만, dict는 알고 있다.
그러므로 dicr 클래스를 상속하고 missing() 메서드를 정의하면 dict.getitem() 표준 메서드가 키를 발견할 수 없을 때 KeyError를 발생시키지 않고 missing() 메서드를 호출한다.

#조회할 때 키를 문자열로 변환하는 StrKeyDict()

class StrKeyDict0(dict):
	def __missing__(self,key):
    	if isinstance(key, str):
    		raise KeyError(key)
    	return self[str(key)]
    
    def get(self, key, default=None):
    	try:
        	return self[key]
        except KeyError:
        	return default
            
    def  __contains__(self, key):
    	return key in self.keys() or str(key) in self.keys()

Summary

아주 큰 매핑의 경우에도 k in my_dict.keys( ) 형태의 검색이 효율적이다.
diet .keys( )는 집합과 비슷한 뷰를 반환하는데, 집합에 포함되었는지 여부를 검사히는 것은 딕셔너리만큼 빠르기 때문이다.

파이썬 2에서 diet.keys( )는 리스트를 반환하므로 여기에서 설명하는코드가작동은 하지만, k in my_list
연산이 리스트를 검색해야 하므로 딕셔너리가 커지면 효율이 떨어진다.


StrKeyDict0은 딕셔너리에 들어 있는 키가 모두 str형이어야 한다고 요구하지 않고 엄격하게 자료형에 따르도록 하는 것이 아닌 친절하게 검색하게 해주는 방법을 보여주는 것입니다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글