본문 바로가기
파이썬

파이썬 변경 불가능한 사전, 다른 사전의 키로 만 사용

by º기록 2020. 9. 15.
반응형

사전을 다른 사전의 키로 사용할 수 있도록 해시 가능한 사전을 구현해야했습니다.


하지만 동료로부터 '정말 불변이 아니기 때문에 안전하지 않다'는 통지를 받았습니다. 당신은 그것을 사용할 수 있지만 그것은 나를 슬픈 팬더처럼 느끼게 만듭니다.

그래서 저는 불변하는 것을 만들기 위해 주위를 둘러보기 시작했습니다. 'key-dict'를 다른 'key-dict'와 비교할 필요가 없습니다. 다른 사전의 키로 만 사용됩니다.

나는 다음을 생각 해냈다.

class HashableDict(dict):
    """Hashable dict that can be used as a key in other dictionaries"""

    def __new__(self, *args, **kwargs):
        # create a new local dict, that will be used by the HashableDictBase closure class
        immutableDict = dict(*args, **kwargs)

        class HashableDictBase(object):
            """Hashable dict that can be used as a key in other dictionaries. This is now immutable"""

            def __key(self):
                """Return a tuple of the current keys"""
                return tuple((k, immutableDict[k]) for k in sorted(immutableDict))

            def __hash__(self):
                """Return a hash of __key"""
                return hash(self.__key())

            def __eq__(self, other):
                """Compare two __keys"""
                return self.__key() == other.__key() # pylint: disable-msg=W0212

            def __repr__(self):
                """@see: dict.__repr__"""
                return immutableDict.__repr__()

            def __str__(self):
                """@see: dict.__str__"""
                return immutableDict.__str__()

            def __setattr__(self, *args):
                raise TypeError("can't modify immutable instance")
            __delattr__ = __setattr__

        return HashableDictBase()

기능을 테스트하기 위해 다음을 사용했습니다.

d = {"a" : 1}

a = HashableDict(d)
b = HashableDict({"b" : 2})

print a
d["b"] = 2
print a

c = HashableDict({"a" : 1})

test = {a : "value with a dict as key (key a)",
        b : "value with a dict as key (key b)"}

print test[a]
print test[b]
print test[c]

다음을 제공합니다.

{ 'a': 1}
{'a': 1}
value with a dict as key (key a)
value with a dict as key (key b)
dict를 키로 사용하는 값 ​​(키 a)

출력으로

이것이 내가 사용할 수있는 '가장 좋은'불변 사전이 내 요구 사항을 충족합니까? 그렇지 않다면 더 나은 해결책은 무엇입니까?

 

해결 방법

 

다른 dict 의 키로 만 사용하는 경우 frozenset (mutabledict.items ()) 로 이동할 수 있습니다. 기본 매핑에 액세스해야하는 경우 dict 에 대한 매개 변수로 사용할 수 있습니다.

mutabledict = dict(zip('abc', range(3)))
immutable = frozenset(mutabledict.items())
read_frozen = dict(immutable)
read_frozen['a'] # => 1


 

참조 페이지 https://stackoverflow.com/questions/9997176

 

 

반응형

댓글