ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Fluent Python] 딕셔너리와 집합
    Programming/Python 2023. 6. 12. 10:14

    키 조건

    해시 가능하다 ⇒ 수명 주기 동안 결코 변하지 않는 해시값, 다른 객체와 비교할 수 있다.

    (원자적 불변형 (str, byte, 수치형), frozenset, tuple(불변형 시퀀스만 포함한 시퀀스))

    지능형 딕셔너리 ( dictcomp)

    country = {country : code for code, country in DIAL_CODES}
    
    DIAL_CODES = [(86, ‘China’), .......]
    

    duck typing 찾기

    isinstance 의 정확한 정리 필요

    객체 메소드를 사용할 때 해당하는 메소드를 재귀적으로 사용하는 부분을 없애야한다.

    contains() 메소드 내에서 in self 사용시 contains()를 호출하는 바보같은 일이 일어남 key in self(재귀적으로 호출되어짐) → key in self.keys()

    dict 와 collections.UserDict() 차이

    setitem()을 사용할 수 있다.

    해당하는 key값을 str로 변경하는 등의 작업이 가능해짐

    불변 매핑을 사용하고 싶을 시

    types 에서 MappingProxyType을 사용하면 가능하다

    ex)

    d = {1 : ‘A’}

    d_proxy = MappingProxyType(d)

    이렇게 할 경우 d로 접근해서는 변경이 가능하지만

    d_proxy에서 접근 후 추가 수정 삭제 는 못함

    집합형(set, frozenset)

    set 은 가변형 , frozenset 은 불변형

    set 은 리터럴 구문으로 하는 것이 생성자를 통해서 하는 것 보다 빠르다

    frozenset 은 생성자로만 호출해서 생성해야함

    💡 파이썬 3.3부터 str.bytes.datetime 객체의 해시에는 무작의 솔트 값이 추가된다.
    파이썬 프로세스가 실행되는 동안에는 동일하게 유지되지만 파이썬 프로세스를 새로 실행하면 달라진다.
    dos 공격을 피하기 위한 보안 장치로 사용된다.

    해시 테이블 알고리즘

    1. 키에서 해시를 계산 ⇒ 해시의 일부를 이용해서 해시 테이블 안에 있는 버킷 위치를 찾음
    2. 빈 버킷이면 key error 발생, 끝
    3. 키가 동일한 경우 반환, 아닌 경우 1 번에서 다른 일부를 이용해서 버킷 위를 찾음 무한 반복 찾을때까지

    평균 충돌 횟수는 1 ~ 2 사이 , 비트를 많이 사용할 수록 충돌률이 낮아짐, 크면 클 수록 공간이 많아서

    dict 는 키 검색이 아주 빠르지만 대신에 공간을 포기함 , 이유는 버킷의 할당되는 크기 때문에

     

    💡 dict는 기본 적으로 순서를 보장한다. 하지만 항목을 추가할 경우에 기존 키의 순서가 변경될 수 있다.
    이유는 기존에 할당된 크기보다 더 커질 경우 새롭게 메모리 테이블에 할당해야하는데 이때 해시 충돌로 인해 순서가 달라질 수 있음. 이 현상은 예측 불가함

     

    집합의 경우 요소의 순서는 요소를 추가한 순서에 따라 달라진다.

    요소를 집합에 추가하면 다른 요소의 순서가 바뀔 수 있다.

Designed by Tistory.