복붙노트

[PYTHON] 다양한 깊이의 멀티 레벨 defaultdict?

PYTHON

다양한 깊이의 멀티 레벨 defaultdict?

나는 다음과 같은 큰 목록을 가지고있다 :

[A][B1][C1]=1
[A][B1][C2]=2
[A][B2]=3
[D][E][F][G]=4

나는 다음과 같은 다단계 사전을 만들고 싶다.

A
--B1
-----C1=1
-----C2=1
--B2=3
D
--E
----F
------G=4

recursive defaultdict를 사용하면 테이블 [A] [B1] [C1] = 1, 테이블 [A] [B2] = 2를 쓸 수 있지만이 문장을 하드 코딩 할 때만 작동한다는 것을 알고 있습니다.

목록을 파싱하는 동안, 나는 [[key1] [key2] [...]] 테이블을 호출하기 위해 얼마나 많은 [[]]가 필요합니까?

해결법

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

    1.클래스를 정의하지 않고도이 작업을 수행 할 수 있습니다.

    클래스를 정의하지 않고도이 작업을 수행 할 수 있습니다.

    from collections import defaultdict
    
    nested_dict = lambda: defaultdict(nested_dict)
    nest = nested_dict()
    
    nest[0][1][2][3][4][5] = 6
    
  2. ==============================

    2.귀하의 예는 어떤 수준에서도 가치가있을 수 있으며 또한 하위 요소의 사전을 말합니다. 이를 트리라고하며 많은 구현이 가능합니다. 이것은 하나입니다.

    귀하의 예는 어떤 수준에서도 가치가있을 수 있으며 또한 하위 요소의 사전을 말합니다. 이를 트리라고하며 많은 구현이 가능합니다. 이것은 하나입니다.

    from collections import defaultdict
    class Tree(defaultdict):
        def __init__(self, value=None):
            super(Tree, self).__init__(Tree)
            self.value = value
    
    root = Tree()
    root.value = 1
    root['a']['b'].value = 3
    print root.value
    print root['a']['b'].value
    print root['c']['d']['f'].value
    

    출력 :

    1
    3
    None
    

    JSON에서 입력을 작성하고 json.load를 사용하여 입력을 중첩 된 사전의 구조로 읽으면 비슷한 결과를 얻을 수 있습니다.

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

    3.나는 __missing__을 정의하는 dict의 서브 클래스로 그것을 할 것이다 :

    나는 __missing__을 정의하는 dict의 서브 클래스로 그것을 할 것이다 :

    >>> class NestedDict(dict):
    ...     def __missing__(self, key):
    ...             self[key] = NestedDict()
    ...             return self[key]
    ...
    >>> table = NestedDict()
    >>> table['A']['B1']['C1'] = 1
    >>> table
    {'A': {'B1': {'C1': 1}}}
    

    defaultdict는 초기화시에 팩토리 함수를 기대하기 때문에 defaultdict로 직접 할 수는 없지만 초기화시 동일한 defaultdict를 설명 할 방법이 없습니다. 위의 구문은 기본 dict와 동일한 작업을 수행하지만 명명 된 클래스 (NestedDict)이므로 누락 된 키가 발생하면 자체를 참조 할 수 있습니다. defaultdict를 서브 클래스 화하고 __init__을 오버라이드하는 것도 가능합니다.

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

    4.재귀 사전의 가장 간단한 구현은 이것이라고 생각합니다. 리프 노드에만 값을 포함 할 수 있습니다.

    재귀 사전의 가장 간단한 구현은 이것이라고 생각합니다. 리프 노드에만 값을 포함 할 수 있습니다.

    # Define recursive dictionary
    tree = lambda: defaultdict(tree)
    

    용법:

    # Create instance
    mydict = tree()
    
    tree['a'] = 1
    tree['b']['a'] = 2
    tree['c']
    tree['d']['a']['b'] = 0
    
    # Print
    import prettyprint
    prettyprint.pp(tree)
    

    산출:

    {
      "a": 1, 
      "b": {
        "a": 1
      }, 
      "c": {},
      "d": {
        "a": {
          "b": 0
        }
      }
    }
    
  5. ==============================

    5.이것은 위와 동일하지만 람다 표기법을 사용하지 않습니다. 읽는 것이 더 쉬울까요?

    이것은 위와 동일하지만 람다 표기법을 사용하지 않습니다. 읽는 것이 더 쉬울까요?

    def dict_factory():
       return defaultdict(dict_factory)
    
    your_dict = dict_factory()
    

    또한 - 댓글에서 - 기존의 dict에서 업데이트하려면 간단하게

    your_dict[0][1][2].update({"some_key":"some_value"})
    

    dict에 값을 추가하려면

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

    6.Dan O'Huiginn은 2010 년 자신의 저널에 아주 좋은 솔루션을 올렸습니다.

    Dan O'Huiginn은 2010 년 자신의 저널에 아주 좋은 솔루션을 올렸습니다.

    http://ohuiginn.net/mt/2010/07/nested_dictionaries_in_python.html

    >>> class NestedDict(dict):
    ...     def __getitem__(self, key):
    ...         if key in self: return self.get(key)
    ...         return self.setdefault(key, NestedDict())
    
    
    >>> eggs = NestedDict()
    >>> eggs[1][2][3][4][5]
    {}
    >>> eggs
    {1: {2: {3: {4: {5: {}}}}}}
    
  7. ==============================

    7.정기적으로 사전을 초기화 할 수있는 약간 다른 가능성 :

    정기적으로 사전을 초기화 할 수있는 약간 다른 가능성 :

    from collections import defaultdict
    
    def superdict(arg=()):
        update = lambda obj, arg: obj.update(arg) or obj
        return update(defaultdict(superdict), arg)
    

    예:

    >>> d = {"a":1}
    >>> sd = superdict(d)
    >>> sd["b"]["c"] = 2
    
  8. ==============================

    8.@Hugo에 추가하려면 최대 깊이 :

    @Hugo에 추가하려면 최대 깊이 :

    l=lambda x:defaultdict(lambda:l(x-1)) if x>0 else defaultdict(dict)
    arr = l(2)
    
  9. ==============================

    9.테이블 [ 'A'] = defaultdict ().

    테이블 [ 'A'] = defaultdict ().

  10. from https://stackoverflow.com/questions/5369723/multi-level-defaultdict-with-variable-depth by cc-by-sa and MIT license