2013-07-19 2 views
0

그래서 같은 데이터 (을 보장 예,이 튜플은 정확히 5 요소를 가지고)이 : 나는 중첩 사전에 구문 분석하려고 해요* 매우 * 중첩 된 DICT 이해

ts = ([('a','b','c','d','e'), ('v','w','x','y','z'), 
     ('f','g','h','i','j'), ('a','foo','bar',1,2), 
     ('f','g','baz',1,3), ('f','g','baz',3,4)]) 

을 다음과 같은 구조 :

d = { 
    'a': { 
     'b': { 
      'c': [('d','e')] 
     }, 
     'foo': { 
      'bar': [(1,2)] 
     } 
    }, 
    'f': { 
     'g': { 
      'h': [('i', 'j')], 
      'baz': [(1,3), (3,4)] 
     } 
    }, 
    'v': { 
     'w': { 
      'x': [('y', 'z')] 
     } 
    } 
} 

이것은 내가 지금까지 가지고있는 것이다.

>>> {t[0]: {t[1]: {t[2]: [(t[3],t[4])]}} for t in ts} 
{'a': {'foo': {'bar': [(1, 2)]}}, 'f': {'g': {'baz': [(3, 4)]}}, 'v': {'w': {'x': [('y', 'z')]}}} 

을 그리고 당신은 정말이 결과를보고 싶지 않아 :

>>> d = {} 
>>> for t in ts: 
...  if t[0] not in d: 
...   d[t[0]] = {t[1]: {t[2]: [(t[3], t[4])]}} 
...  elif t[1] not in d[t[0]]: 
...   d[t[0]][t[1]] = {t[2]: [(t[3], t[4])]} 
...  elif t[2] not in d[t[0]][t[1]]: 
...   d[t[0]][t[1]][t[2]] = [(t[3], t[4])] 
...  else: 
...   d[t[0]][t[1]][t[2]].append((t[3],t[4])) 
... 
>>> d 
{'a': {'b': {'c': [('d', 'e')]}, 'foo': {'bar': [(1, 2)]}}, 'f': {'g': {'h': [('i', 'j')], 'baz': [(1, 3), (3, 4)]}}, 'v': {'w': {'x': [('y', 'z')]}}} 

나는 물론, 일부 값을 덮어있어,이 이해를 시도 할 때 : 제대로 작동하는 것 같다 :

>>> {t[0]: {t[1]: {t[2]: [(t[3],t[4])] for t in ts} for t in ts} for t in ts} 

이 독트럽 독해를 올바르게 쓰려면 어떻게해야합니까?

편집 : 미안, 내가 언급하는 것을 잊었다 해요 -이 (이것은 결국 PyObjC를 통해 NSDictionary로 변환 점점) 하루의 끝에 정규 사전해야합니다.

+0

'ts가 튜플로되어 있습니까? 주위에 아무 것도하지 않는 한 쌍의 괄호가있는 것 같습니다. – user2357112

+0

@ user2357112 그건 통역사를위한 [편집증 parens] (http://memegenerator.co/instance/34622417)입니다. – 2rs2ts

답변

5

자동으로 필요에 따라 자신의 중첩 된 구조를 구축 나는 사전을 설정하는 것 :

from collections import defaultdict 

dct = defaultdict(lambda: defaultdict(lambda: defaultdict(list))) 

그런 다음 오른쪽 목록에이 튜플을 추가 :

for a, b, c, d, e in ts: 
    dct[a][b][c].append((d, e)) 

다른 수준의 경우를 색인 생성에는 의미가 있습니다. a, b, c보다 나은 이름을 사용합니다.

+0

이전에'defaultdict'를 시도했지만 선언문을 읽었습니다 ... 나는 팩토리 함수가 인수를 취할 수 없다는 사실을 잊어 버렸습니다. 그래서,이 작품; 하지만 나는'defaultdict's를 일반 사전으로 변환하려고 애 쓰지 않았습니다. 나는'dict (dct)'를 시도했지만 아무 소용이 없었다. 내 게시물을 편집하여 요구 사항임을 알립니다. – 2rs2ts

+0

@ 2rs2ts : 왜 중요할지 모르겠습니다. 'defaultdict' 클래스는'dict'을 상속합니다. 그래서'dict'을 기대하는 다른 코드는'defaultdict'를 자동으로 처리해야합니다. 동일한 기능을 수행하지 못하는 유일한 기능은 존재하지 않는 키를 가져 오는 중이고 예외가 발생할 것으로 예상하는 것입니다. – Blckknght

+0

아, 깔끔하게, 실제로 잘 작동합니다. (나는'__repr__ '이 나에게 공장 람다를 보여 주었기 때문에 제대로 번역하지 않을 것이라고 생각했다.) 맞다! – 2rs2ts