복붙노트

[PYTHON] 파이썬 사전을 키로 사용 (중첩되지 않음)

PYTHON

파이썬 사전을 키로 사용 (중첩되지 않음)

파이썬에서는 사전을 다른 사전의 키로 사용할 수 없습니다. 중첩되지 않은 사전을 키로 사용하기위한 해결 방법이 있습니까?

보다 복잡하지 않은 해시 가능 객체와 내 특정 유스 케이스의 일반적인 문제가 여기로 옮겨졌습니다. 내 유스 케이스에 대한 내 원래 설명이 잘못되었습니다.

해결법

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

    1.정말 불변의 사전이 있다면 (필자가 [( 'content-type', 'text / plain'), ( 'host', ' example.com ')]), 당신은 당신의 딕트로 변환 할 수 있습니다 :

    정말 불변의 사전이 있다면 (필자가 [( 'content-type', 'text / plain'), ( 'host', ' example.com ')]), 당신은 당신의 딕트로 변환 할 수 있습니다 :

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

    2.사전을 키로 사용해야한다면, 사전을 투플 (tuple)의 튜플로 변환 할 것입니다.

    사전을 키로 사용해야한다면, 사전을 투플 (tuple)의 튜플로 변환 할 것입니다.

    이 SO 질문은 유용 할 것입니다. 중첩 된 사전을 구현하는 가장 좋은 방법은 무엇입니까?

    다음은 사전을 병합하는 병합 모듈의 예입니다. http://yawpycrypto.sourceforge.net/html/public/Flatten.Flatten-module.html

    귀하의 유스 케이스를 완전히 이해하지 못하고 최적화가 필요없는 무언가를 조기에 최적화하려고하고 있다고 생각합니다.

  3. ==============================

    3.이를 수행하는 한 가지 방법은 dict를 서브 클래스 화하고 해시 메소드를 제공하는 것입니다. 즉 :

    이를 수행하는 한 가지 방법은 dict를 서브 클래스 화하고 해시 메소드를 제공하는 것입니다. 즉 :

    class HashableDict(dict):
        def __hash__(self):
            return hash(tuple(sorted(self.iteritems())))
    
    >>> d = HashableDict(a=1, b=2)
    >>> d2 = { d : "foo"}
    >>> d2[HashableDict(a=1, b=2)]
    "foo"
    

    그러나 dicts (또는 임의의 변경 가능한 유형)가 이렇게하지 않는 이유를 명심하십시오 : 해시 테이블에 객체를 추가 한 후에 객체를 변경하면 해시가 변경되므로 dict이 잘못된 버킷에있을 수 있습니다. 잘못된 결과가 반환됩니다.

    이 경로를 사용하는 경우 dicts가 다른 사전에 추가 된 후에 절대로 변경되지 않거나 적극적으로 금지됩니다 (예 : __hash__의 첫 번째 호출 이후 해시가 변경되지 않는지 확인). if 아니.)

  4. ==============================

    4.흠, 함수 호출을 메모하는 유스 케이스가 아닌가? 데코레이터를 사용하면 임의의 기능을 쉽게 지원할 수 있습니다. 그리고 예, 그들은 종종 논쟁을 피클링하고, 순환 추론을 사용하여, 비표준 형에 대해서는 절편 될 수있는 한 작동합니다.

    흠, 함수 호출을 메모하는 유스 케이스가 아닌가? 데코레이터를 사용하면 임의의 기능을 쉽게 지원할 수 있습니다. 그리고 예, 그들은 종종 논쟁을 피클링하고, 순환 추론을 사용하여, 비표준 형에 대해서는 절편 될 수있는 한 작동합니다.

    예 : 이 메모 샘플

  5. ==============================

    5.someDictionary를 키로 변환하려면 다음과 같이하십시오.

    someDictionary를 키로 변환하려면 다음과 같이하십시오.

    key = tuple(sorted(someDictionary .items())
    

    dict (key)를 사용하여 쉽게 이것을 뒤집을 수 있습니다.

  6. ==============================

    6.나는 왜 당신이 이것을하고 싶어하는지 알지 못한다. 그러나 정말로 정말로해야 할 일이 있다면, 당신은 사전을 pickling 할 수있다.

    나는 왜 당신이 이것을하고 싶어하는지 알지 못한다. 그러나 정말로 정말로해야 할 일이 있다면, 당신은 사전을 pickling 할 수있다.

    mydict = {"a":1, "b":{"c":10}}
    import pickle
    key = pickle.dumps(mydict)
    
    d[key] = value
    
  7. ==============================

    7.내가 당신의 질문을 정확하게 이해하는지 모르겠지만, 시도해 볼게요.

    내가 당신의 질문을 정확하게 이해하는지 모르겠지만, 시도해 볼게요.

        d[repr(a)]=value
    

    이런 식으로 사전을 반복 할 수 있습니다.

    for el1 in d:
            for el2 in eval(el1):
                    print el2,eval(el1)[el2]
    
  8. from https://stackoverflow.com/questions/1600591/using-a-python-dictionary-as-a-key-non-nested by cc-by-sa and MIT license