while (1): study();

Part2. 데이터 구조체 본문

독서

Part2. 데이터 구조체

전국민실업화 2021. 12. 5. 04:39
728x90

2. 시퀀스

분류

컨테이너 시퀀스: 서로 다른 자료형의 항목을 담을 수 있음, 객체 참조를 담음

    ex) list, tuple, collections.deque

균일 시퀀스: 단 하나의 자료형만 담을 수 있음, 객체의 값을 직접 메모리에 할당

    ex) str, bytes, bytearray, memoryview, array.array

가변 시퀀스: list, bytearray, array.array, collections.deque, memoryview

불변 시퀀스: tuple, str, butes

 

array.array: 수치 연산에 최적화

Memoryview: 데이터 구조체를 복사하지 않고 메모리 공유

 

bisect

순서 유지하면서 항목 추가 : bisect.insort()

정렬된 시퀀스를 효율적으로 검색 : bisect.bisect()

 

3. 딕셔너리와 집합

해시 가능

1. 수명 주기 동안 결코 변하지 않는 해시값 (__hash__() 메서드)

2. 다른 객체와 비교 가능(__eq__() 메서드)

3. 동일한 객체는 해시값 동일

 

키 검색 실패 대응

1) setdefault(): 키가 있으면 값 가져오고, 없으면 기본값으로 해당 키 생성 후 기본값 반환

2) collections.defaultdict

3) __missing__() 메서드

 

업데이트

update(): 대량으로 데이터 추가 및 오버라이딩

 

해시 테이블: dict와 set에 적용

1) 메모리 오버헤드가 크다

2) 키 검색이 빠르다

3) 순서는 삽입 순서

* 순서가 변경될 수는 있다 -> 항목을 추가할때마다 해시테이블 크기를 늘릴지 판단하기 때문

 

4. 텍스트와 바이트

* python 2 vs python 3

  Python2   Python3
str string str unicode data
unicode unicode data bytes bytes

문자열

인코딩: 코드포인트 -> 바이트

디코딩: 바이트 -> 코드포인트

 

바이트

bytes: 불변

bytearray: 가변

 

UnicodeEncodeError 처리

# 1. 모르면 무시
str.encode('cp949', errors='ignore')
# 2. ?로 대체
str.encode('cp949', errors='replace')
# 3. xml개체로 대체
str.encode('cp949', errors='xmlcharrefreplace')

 

바이트 시퀀스의 인코딩 방식 알아내기

Chardet 패키지

chardetect ~.asciidoc

 

텍스트 파일 다루기

유니코드 샌드위치: 입출력만 bytes, 나머지는 str으로 처리

 

유니코드 정규화

# 정규화 비교
def fold_equal(str1, str2):
    from unicodedata import normalize
    
    return (normalize('NFC', str1).casefold() == normalize('NFC', str2).casefold())

NFC: 합쳐서 정규화

NFD: 나눠서 정규화

NFKC, NFKD: 호환성 문자 

 

발음 구별 기호 제거

unicodedata.combining() 사용

# 결합문자 제거
def shave_marks_latin(txt):
    import unicodedata, string
    
    norm_txt = unicodedata.normalize('NFD', txt)
    laten_base = False
    keepers = []
    for c in norm_txt:
        if unicodedata.combining(c) and latin_base:
            continue
        keepers.append(c)
        if not unicodedata.combining(c): # 결합문자가 뒤에 오기 때문에 여기 위치
            latin_base = c in string.ascii_letters
            
    shaved = ''.join(keepers)
    return unicodedata.normalize('NFC', shaved)

 

유니코드 정렬

Pyuca 패키지

import pyuca

coll = pyuca.Collator()
fruits = ['caju', 'atemoia', 'cajá', 'açai', 'acerola']
sorted_fruits = sorted(fruits, key=coll.sort_key)
sorted_fruits
728x90

'독서' 카테고리의 다른 글

Part4. 객체지향 상용구  (0) 2021.12.05
Part3. 객체로서의 함수  (0) 2021.12.05
Part1. 들어가며  (0) 2021.12.05
Ch8. 어텐션  (0) 2021.08.01
Ch7. RNN을 사용한 문장 생성  (0) 2021.07.31
Comments