2013-06-11 2 views
1

많은 검색을 한 후에이 작업을 수행하는 방법을 찾을 수없는 것 같습니다.파이썬 루핑 전체 사전

DICT :

mdr = {'main': {'sm': {'testm': {'test1': 'test', 'test2': 'test'}}, 'lm': {}, 'l': {}}} 

내가 같이 그것을 싶습니다

-Main 
--SM 
---Testm 
----Test1:Test 
----Test2:Test 
--LM 
--L 

내가 그것을 처리 할 하위 디렉토리의 정확한 양을 알 수 없습니다 그래서 필요 직접 전체를 통과 할 루프를 만드십시오. 나는 사전이 얼마나 멀리 떨어져 있는지 아는 경우에만 전체 디렉토리를 표시하는 방법을 알고 있습니다. 가능한 모든 가능한 키를 표시하고 싶습니다.

+1

라인을 실행 나에게 구문 에러를 제공합니다. 사전을 다시 확인해 주시겠습니까? –

+0

@Xaranke 업데이트 됨, 죄송합니다. – TrevorPeyton

답변

4

재귀가 루프보다 나은 내기라고 생각합니다. 이것은 꽤 가깝습니다.

def print_dict(d, current_depth=1): 
    for k, v in d.items(): 
     if isinstance(v, dict): 
      print '-' * current_depth + str(k) 
      print_dict(v, current_depth + 1) 
     else: 
      print '-' * current_depth + str(k) + ':' + str(v) 

출력 (사용자 사전의 구문을 수정 후) :

>>> print_dict(mdr) 
-main 
--lm 
--l 
--sm 
---testm 
----test1:test 
----test2:test 

사례가 원하는 출력으로부터이지만, 당신이 그것을 처리 할 수 ​​있어야합니다. 원래 주문을 유지하려면 dict 대신 OrderedDict을 사용해야합니다. dict은 해시 테이블이므로 주문과 관련된 모든 작업을 수행 할 수 있습니다. (다행히 isinstance(v, dict) 시험은 여전히 ​​OrderedDict에서 작동합니다.)

+0

프린트가 파이썬 3.x에서 어떻게 될지 아십니까? 이렇게 되겠습니까?'print ('-'* current_depth + str (k)) ' – TrevorPeyton

+0

그래. 파이썬 3의'print'에 괄호를 추가해야합니다. – jpmc26

+0

감사합니다. 나는 함수를 다시 호출하는 것처럼 간단하다고 믿을 수 없다. 훌륭한! – TrevorPeyton

1
def tree(data, indent=0): 
    if isinstance(data, basestring): 
     print '{i}{d}'.format(i='-'*indent, d=data) 
     return 
    for key, val in data.iteritems(): 
     if isinstance(val, dict): 
      print '{i}{k}'.format(i='-'*indent, k=key) 
      tree(val, indent + 1) 
     else: 
      print '{i}{k}:{v}'.format(i='-'*indent, k=key, v=val) 

tree(mdr) 

출력 :

>>> mdr = {'main': {'sm': {'testm': {'test1': 'test', 'test2': 'test'}, 'lm': {}, 'l': {}}}} 
>>> def tree(data, indent=0): 
     if isinstance(data, basestring): 
      print '{i}{d}'.format(i='-'*indent, d=data) 
      return 
     for key, val in data.iteritems(): 
      if isinstance(val, dict): 
       print '{i}{k}'.format(i='-'*indent, k=key) 
       tree(val, indent + 1) 
      else: 
       print '{i}{k}:{v}'.format(i='-'*indent, k=key, v=val) 

>>> tree(mdr) 
main 
-sm 
--lm 
--testm 
---test1:test 
---test2:test 
--l 
>>> 
+0

'NameError : global name 'tree'is not defined '가 발생하고 결과가 내 답변과 같은 순서로 표시됩니다. – jpmc26

+0

답변에 콘솔 I/O를 추가했습니다. – bnlucas

+0

아, 알겠습니다. 귀하의 예에서는 중괄호가 다릅니다. 'lm'과'l'은 여러분의 출력에서 ​​더 들여 쓰여진'sm'입니다. 원본 사전에는 구문 오류가있었습니다. 가장 최근의 것으로 시도하십시오. – jpmc26

1

: (이 답변의 의견에 응답) 콘솔에서

main 
-sm 
--lm 
--testm 
---test1:test 
---test2:test 
--l 

입력 당신은 당신이 시도한 것을 보여줘야합니다.

관계없이, 나는 그것이 재미있는 프로젝트라고 생각했다. 내 해결책에 대해 어떻게 생각하세요? 원하는 결과에 예상치 못한 대문자가 포함되지 않습니다. 그러나 그렇다면 예기치 않은 것을 어떻게 기대할 수 있습니까?

def dict_tree(d, i = 1): 
    for key, value in d.items(): 
     if isinstance(value, dict): 
      print '-' * i + key 
      dict_tree(value, i + 1) 
     else: 
      print '-' * (i + 1) + key + ':' + value 

해야 출력 :

-main 
--lm 
--l 
--sm 
---testm 
-----test1:test 
-----test2:test 
+1

나는 하루 종일 똑같은 것을 보았습니다. :). 예상치 못한 대문자가 무엇을 의미합니까? 또한, 내가 뭘 시도했는지에 관해서는 시도하는 법조차 몰랐다. 고맙습니다! – TrevorPeyton