>

dict 클래스에서 상속 받고 항목을 1 대 1로 매핑하려고합니다.

key : value 대신setitem을 구현하려고합니다. key1 : key 2, key2 : key1도 추가됩니다. 키 중 하나가 이미 존재하면 쌍을 추가하기 전에 터져야합니다.집합을 어떻게 구현할 수 있습니까?

init는 빈 사전 또는 주어진 사전에서 매핑을 구성 할 수 있어야합니다

어떤 아이디어? 감사합니다

class Mapping(dict):
    def __init__(self, Map = None):
        if Map = None:
            Map = dict()
        else:
            self.update(Map)
    def __repr__(self):
        return "Mapping({})".format(dict.__repr__self)
    def pop(self):
        return self.pop   #??? How can I pop a key and also pop the key it maps to?
    def __setitem__(self, key1,key2):
        self.__dict__[key1] = key2
        self.__dict__[key2] = key1


  • 답변 # 1

    pop  키를 인수로 사용하여 연관된 값을 리턴합니다. pop1 key1에서 얻은 값을 key2로 팝하십시오.

    당신은 단지 self.__dict__.pop(self.__dict__.pop(key)) 를 할 수 있습니다

  • 답변 # 2

    다음과 같이 할 수 있습니다 :

    from collections.abc import MutableMapping
    # We need to implement those method: __getitem__, __setitem__, __delitem__, __iter__, __len__
    class TwoWayDict(MutableMapping):
        __slots__ = '__dict__'
        def __init__(self, *args, **kwargs):
            self.__dict__.update(*args, **kwargs)
        def __getitem__(self, key):
            return self.__dict__[key]
        def __setitem__(self, key, value):
            self.__dict__[key] = value
            self.__dict__[value] = key
        def __delitem__(self, key):
            self.__dict__.__delitem__(self[self[key]])            
            self.__dict__.__delitem__(self[key])  # this do not work if key == value
        def __iter__(self):
            return iter(self.__dict__)
        def __len__(self):
            return len(self.__dict__)
        def get(self, key, default=None):
            return self[key] if key in self else default
        def __str__(self):
            return str(self.__dict__)
    
    

    테스트 :

    a = TwoWayDict()
    a['key1'] = 'key2'
    print(a)
    print(a['key1'])
    print(a['key2'])
    print(len(a))
    for key, val in a.items():
        print(key, val)
    
    

    결과 :

    {'key1': 'key2', 'key2': 'key1'}
    key2
    key1
    2
    key1 key2
    key2 key1
    
    

    길이와 반복은 모호 할 수 있습니다. 중복 키를 표시하지 않으려면 dict 항목에서 키를 찾아 해당 키를 반환해야합니다. 팝을 위해 SW Williams가 제안한 솔루션을 사용할 수 있습니다.

    편집 : dict (아마도 할당 ...)에서 상속 해야하는 경우 __setitem__ 를 무시하므로 업데이트를 구현하는 것을 잊지 마십시오.  받아쓰기 또한 키에 대한 일대일 맵이있는 경우 __del__ 에서이를 처리해야합니다.  그리고 __pop__  기능.

관련 자료

  • 이전 reactjs - 반응/redux/다시 선택 - redux store에 저장된 데이터를 필터링하는 데 사용하기 위해 로컬 상태로 저장된 인수를 전달하는 방법은 무엇입니까?
  • 다음 SQL은 null/빈 데이터 (DB2)를 포함하여 최소 타임 스탬프를 얻는 방법