[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.클래스를 정의하지 않고도이 작업을 수행 할 수 있습니다.
클래스를 정의하지 않고도이 작업을 수행 할 수 있습니다.
from collections import defaultdict nested_dict = lambda: defaultdict(nested_dict) nest = nested_dict() nest[0][1][2][3][4][5] = 6
-
==============================
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.나는 __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.재귀 사전의 가장 간단한 구현은 이것이라고 생각합니다. 리프 노드에만 값을 포함 할 수 있습니다.
재귀 사전의 가장 간단한 구현은 이것이라고 생각합니다. 리프 노드에만 값을 포함 할 수 있습니다.
# 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.이것은 위와 동일하지만 람다 표기법을 사용하지 않습니다. 읽는 것이 더 쉬울까요?
이것은 위와 동일하지만 람다 표기법을 사용하지 않습니다. 읽는 것이 더 쉬울까요?
def dict_factory(): return defaultdict(dict_factory) your_dict = dict_factory()
또한 - 댓글에서 - 기존의 dict에서 업데이트하려면 간단하게
your_dict[0][1][2].update({"some_key":"some_value"})
dict에 값을 추가하려면
-
==============================
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.정기적으로 사전을 초기화 할 수있는 약간 다른 가능성 :
정기적으로 사전을 초기화 할 수있는 약간 다른 가능성 :
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.@Hugo에 추가하려면 최대 깊이 :
@Hugo에 추가하려면 최대 깊이 :
l=lambda x:defaultdict(lambda:l(x-1)) if x>0 else defaultdict(dict) arr = l(2)
-
==============================
9.테이블 [ 'A'] = defaultdict ().
테이블 [ 'A'] = defaultdict ().
from https://stackoverflow.com/questions/5369723/multi-level-defaultdict-with-variable-depth by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] ASCII가 아닌 문자를 제거하고 파이썬을 사용하여 마침표와 공백을 남기려면 어떻게합니까? (0) | 2018.10.07 |
---|---|
[PYTHON] Pyspark : 행으로 여러 배열 열을 분할 (0) | 2018.10.07 |
[PYTHON] Python pandas를 사용하여 날짜 및 시간 열 결합 (0) | 2018.10.07 |
[PYTHON] urllib.urlopen () 다음에 close ()를 호출해야합니까? (0) | 2018.10.07 |
[PYTHON] 후행 쉼표가 목록에서 허용되는 이유는 무엇입니까? (0) | 2018.10.07 |