У меня есть вложенный словарь, подобный этому {"step1": {}, "step2": {"step3": {"step4": {}},'step7':{}}}, теперь мне нужно рекурсивно перебрать вложенный словарь и создайте список ключей вложенного словаря с добавленными к нему вкладками.
new_d = {"step1": {}, "step2": {"step3": {"step4": {}},'step7':{}}}
other_list=[]
child=False
tabb='\t'
def put_tabs(d):
global tabb,child
for k, v in d.iteritems():
if v:
if child:
other_list.append("{0}{1}".format(tabb,k))
tabb+='\t'
else:
other_list.append("{0}".format(k))
child=True
put_tabs(v)
else:
if child:
other_list.append("{0}{1}".format(tabb,k))
else:
other_list.append("{0}:".format(k))
child=False
put_tabs(new_d)
print other_list
# Expected output ['step2', '\tstep7', '\tstep3', '\t\tstep4', 'step1:']
# current ouput ['step2', '\tstep7', 'step3', '\t\step4', 'step1:']
это функция, которая будет печатать ключи вложенного словаря с отступом:
def indent_dict(d, indent=0):
for key, value in d.iteritems(): # python 2
# for key, value in d.items(): # python 3
print("\t" * indent + str(key))
if isinstance(value, dict):
indent_dict(value, indent + 1)
else:
print("\t" * (indent + 1) + str(value))
за ваш вклад
new_d = {"step1": {}, "step2": {"step3": {"step4": {}}, "step7": {}}}
indent_dict(new_d)
он выводит:
step1
step2
step3
step4
step7
(это более или менее функция отступа для xml из здесь).
new_d = {"step1": {}, "step2": {"step3": {"step4": {}},'step7':{}}}
def fn(d, counter):
for k, v in d.items():
yield '\t' * counter + k
if isinstance(v, dict):
yield from fn(v, counter + 1)
out = []
for p in fn(new_d, 0):
out += [p]
print(out)
Отпечатки:
['step1', 'step2', '\tstep3', '\t\tstep4', '\tstep7']
Как вы уже сказали, подойдет простая рекурсия:
def put_tabs(d, level=0):
rv = []
prefix = '\t' * level
for key in d:
rv.append(prefix+key)
if type(d[key]) == dict and len(d[key]) > 0:
rv.extend(put_tabs(d[key], level=level+1))
return rv
d = {"step1": {}, "step2": {"step3": {"step4": {}}, "step7": {}}}
print(put_tabs(d))
# ['step1', 'step2', '\tstep3', '\t\tstep4', '\tstep7']
step4 является дочерним элементом step3, который является внутренне дочерним элементом step2, поэтому две вкладки для step4