2013-07-22 3 views
4

자연 첨자와 3 차원 OrderedDict 만들기 :나는 다음과 같은 속성이 사전 구조를 원하는

  1. 사물의 순서를 기억한다 이중 (너무 많은 단어 너무, 3 차원) 중첩 내가 지금처럼 항목을 추가하는 경우,

그래서 각 레벨을 위해 추가 :

# d = something dict-ish 
d['a']['b']['c'] = 'd' 
d['a'][1][2] = 3 
d['f']['g']['e'] = 'g' 
d['f'][5][6] = 7 
d['a']['foo']['bar'] = 'hello world' 

다음과 같은 이해의 결과는 :

[(i, j, k, d[i][j][k]) for i in d for j in d[i] for k in d[i][j]] 

은 다음과 같습니다

[('a', 'b', 'c', 'd'), ('a', 1, 2, 3), ('a', 'foo', 'bar', 'hello world'), ('f', 'g', 'e', 'g'), ('f', 5, 6, 7)] 

나는 내가 그것을 긴 입력하지 않아도 새로운 키에이 구조를 강화하기 위해 defaultdict를 사용하여 시도했다 방법과 같이 :

# long way 
d = OrderedDict() 
d['a'] = OrderedDict([('b', OrderedDict([('c', 'd')]))]) 
d['a'][1] = OrderedDict([(2,3)]) 

# tried to use defaultdict 
d = defaultdict(lambda: defaultdict(lambda: OrderedDict())) 
d['a']['b']['c'] = 'd' 
d['a'][1][2] = 3 

그러나 defaultdict 상단 두 단계의 순서를 기억하지 않습니다. 나는 어떻게 행동을 병합 할 지 모르겠다. 그래서 분명히 상위 2 레벨은 d을 그렇게 선언했기 때문에 defaultdict 행동을 산출하고있다. 내가 원하는 구조를 어떻게 얻을 수 있습니까? 존재하는 경우

from collections import OrderedDict 

class DefaultOrderedDict(OrderedDict): 
    def __missing__(self, key): 
     self[key] = type(self)() 
     return self[key] 

기본dict 유형이 defaultdict 유형 사용을 만드는 것입니다 KeyError을 제기하기 전에 __missing__ 메소드를 호출 :

+0

@MartijnPieters. – 2rs2ts

답변

6

는 당신이 필요로하는 모든 OrderedDict를 서브 클래스와 __missing__ 기능을 추가하는 것입니다 의. 의 DICT의 서브 클래스가 메소드 __missing__()을 정의하는 경우, 키 이없는 경우 :

새로운 버전 2.5에 :

dict documentation합니다 (d[key] 설명을 아래로 스크롤)를 참조하십시오 d[key] 연산은 을 인수로 사용하여 해당 메소드를 호출합니다. d[key] 작업은 키가없는 경우 __missing__(key) 호출에 의해 반환되거나 발생되는 모든 것을 반환하거나 발생시킵니다. 다른 작업이나 메서드는 __missing__()을 호출하지 않습니다. __missing__()이 정의되어 있지 않으면 KeyError이 발생합니다. __missing__()은 메소드 여야합니다. 인스턴스 변수가 될 수 없습니다.

데모 :

>>> d = DefaultOrderedDict() 
>>> d['a']['b']['c'] = 'd' 
>>> d['a'][1][2] = 3 
>>> d['f']['g']['e'] = 'g' 
>>> d['f'][5][6] = 7 
>>> d['a']['foo']['bar'] = 'hello world' 
>>> [(i, j, k, d[i][j][k]) for i in d for j in d[i] for k in d[i][j]] 
[('a', 'b', 'c', 'd'), ('a', 1, 2, 3), ('a', 'foo', 'bar', 'hello world'), ('f', 'g', 'e', 'g'), ('f', 5, 6, 7)] 
+0

'__missing__' ?! 처음으로 나는 그것을보고있다. 굉장해! +1 있으라. – inspectorG4dget

+0

나는 이것을 줄 것이다. – 2rs2ts

+0

그래, 내가 알 수있는 한 나를 위해 일한다. TVYM. – 2rs2ts

1

오래된 옛날 방식 : 네, 아마 실제로 내가 무엇을 의미

data = [('a','b','c','d'), ('a',1,2,3), ('f,'g','e','g'), ('f',5,6,7), (a','foo','bar','hello world')] 

answer = OrderedDict() 
for d in data: 
    if d[0] not in answer: 
     answer[d[0]] = OrderedDict() 
    if d[1] not in answer[d[0]]: 
     answer[d[0]][d1] = OrderedDict() 
    if d[2] not in answer[d[0]][d1]: 
     answer[d[0]][d1][d2] = OrderedDict() 
    answer[d[0]][d1][d2] = d[3] 
+0

나는 아주 비슷한 것을 미리 가지고 있었지만 깨 졌다고 생각한다. 이게 낫다! – 2rs2ts

+0

@ 2rs2ts : 기꺼이 도와 드리겠습니다. – inspectorG4dget