经过多次搜索,我似乎无法了解如何做到这一点。
字典:
mdr = {'main': {'sm': {'testm': {'test1': 'test', 'test2': 'test'}}, 'lm': {}, 'l': {}}}
我希望它看起来像这样:
-Main
--SM
---Testm
----Test1:Test
----Test2:Test
--LM
--L
我不会知道它将处理的子目录的确切数量,所以我需要创建一个循环来完成整个直接。如果我知道字典走了多远,我只知道如何显示整个目录。我希望它尽可能显示所有可能的键。
答案 0 :(得分: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
案例与您想要的输出关闭,但您应该能够处理。如果您想保留原始订单,则需要使用OrderedDict
代替dict
。 dict
是一个哈希表,因此它可以对订单执行任何操作。 (幸运的是,isinstance(v, dict)
测试仍适用于OrderedDict
。)
答案 1 :(得分: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)
输出:
main
-sm
--lm
--testm
---test1:test
---test2:test
--l
从控制台输入(响应对此答案的评论):
>>> 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
>>>
答案 2 :(得分:1)
你应该展示你尝试过的东西。
无论如何,我认为这是一个有趣的项目。您如何看待我的解决方案?它不包含您首选结果中的意外上限。但是,那么,你怎么能期待意外呢?
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