복붙노트

[PYTHON] Python 값에 대해 "해시 가능"합니다.

PYTHON

Python 값에 대해 "해시 가능"합니다.

나는 임의의 딕트 (dict)를 가져 와서 그것을 새로운 딕트 (dict)에 복사하는 것에 흥미가있다.

하나의 돌연변이는 키와 값을 교환하는 것입니다. 불행히도, 일부 가치는 독자적인 권리를 가지고 있습니다. 그러나이 "unhashable 형식 : 'dict'"오류가 발생합니다. 나는 단지 값을 문자열로 만들고 키를주는 것에 신경 쓰지 않습니다. 그러나 나는 이렇게 할 수 있기를 바란다 :

for key in olddict:
  if hashable(olddict[key]):
    newdict[olddict[key]] = key
  else
    newdict[str(olddict[key])] = key

거기에 예외를 트래핑 및 "unhashable 형식"에 대한 메시지 문자열을 구문 분석을 포함하지 않는 이렇게 깨끗한 방법이 있나요?

해결법

  1. ==============================

    1.파이썬 2.6부터 추상 기본 클래스 컬렉션을 사용할 수 있습니다. Hashable :

    파이썬 2.6부터 추상 기본 클래스 컬렉션을 사용할 수 있습니다. Hashable :

    import collections
    >>> isinstance({}, collections.Hashable)
    False
    >> isinstance(0, collections.Hashable)
    True
    

    이 접근법은 __hash__에 대한 문서에서도 간략하게 언급되어 있습니다.

  2. ==============================

    2.

    def hashable(v):
        """Determine whether `v` can be hashed."""
        try:
            hash(v)
        except TypeError:
            return False
        return True
    
  3. ==============================

    3.해시 가능한 모든 파이썬 객체에는 .__ hash __ () 메소드가 있습니다. 당신은 그것을 확인할 수 있습니다.

    해시 가능한 모든 파이썬 객체에는 .__ hash __ () 메소드가 있습니다. 당신은 그것을 확인할 수 있습니다.

    olddict = {"a":1, "b":{"test":"dict"}, "c":"string", "d":["list"] }
    
    for key in olddict:
       if(olddict[key].__hash__):
          print str(olddict[key]) + " is hashable"
       else: 
          print str(olddict[key]) + " is NOT hashable"
    

    산출

    1 is hashable
    string is hashable
    {'test': 'dict'} is NOT hashable
    ['list'] is NOT hashable
    
  4. ==============================

    4.왜 오리 타이핑을 사용하지 않습니까?

    왜 오리 타이핑을 사용하지 않습니까?

    for key in olddict:
       try:
           newdict[olddict[key]] = key
       except TypeError:
           newdict[str(olddict[key])] = key
    
  5. from https://stackoverflow.com/questions/3460650/asking-is-hashable-about-a-python-value by cc-by-sa and MIT license