반응형
사전을 다른 사전의 키로 사용할 수 있도록 해시 가능한 사전을 구현해야했습니다.
하지만 동료로부터 '정말 불변이 아니기 때문에 안전하지 않다'는 통지를 받았습니다. 당신은 그것을 사용할 수 있지만 그것은 나를 슬픈 팬더처럼 느끼게 만듭니다.
그래서 저는 불변하는 것을 만들기 위해 주위를 둘러보기 시작했습니다. '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
반응형
'파이썬' 카테고리의 다른 글
파이썬에서 날짜가 유효한지 확인하는 방법은 무엇입니까? (0) | 2020.09.15 |
---|---|
파이썬에서 멋진 열 출력 만들기 (0) | 2020.09.15 |
파이썬 반복 된 정사각형 큐브 및 짝수 / 홀수 (0) | 2020.09.14 |
파이썬 pycharm에 스크래피 설치 (0) | 2020.09.14 |
파이썬 패키지 목록에 가져 오기를 사용하는 방법이 있습니까? (0) | 2020.09.14 |
댓글