my_dict1 = {'a':1, 'chk':{'b':2, 'c':3}, 'e':{'chk':{'f':5, 'g':6}} }
我想循环遍历dict,如果键是'chk',则拆分它。
预期产出:
{'a':1, 'b':2, 'e':{'f':5}}
{'a':1, 'c':3, 'e':{'f':5}}
{'a':1, 'b':2, 'e':{'g':6}}
{'a':1, 'c':3, 'e':{'g':6}}
不确定如何实现这一目标。请帮忙。
我试过的是下面的内容。
temp_list =[]
for k,v in my_dict1.iteritems():
temp ={}
if k is "chk":
for key,val in v.iteritems():
temp[key] = val
my_dict1[k]={}
for ky,vl in temp.iteritems():
my_new_dict = copy.deepcopy(my_dict1)
for k,v in my_new_dict.iteritems():
if k is "chk":
my_new_dict[k] = {ky:vl}
temp_list.append(my_new_dict)
print temp_list
输出:
[{'a': 1, 'chk': ('c', 3), 'e': {'chk': {'f': 5, 'g': 6}}},
{'a': 1, 'chk': ('b', 2), 'e': {'chk': {'f': 5, 'g': 6}}}]
如何使其递归?
答案 0 :(得分:2)
from itertools import product
my_dict = {'a':1, 'chk':{'b':2, 'c':3}, 'e':{'chk':{'f':5, 'g':6}} }
def process(d):
to_product = [] # [[('a', 1)], [('b', 2), ('c', 3)], ...]
for k, v in d.items():
if k == 'chk':
to_product.append([(k2, v2)
for d2 in process(v)
for k2, v2 in d2.items()])
elif isinstance(v, dict):
to_product.append([(k, d2) for d2 in process(v)])
else:
to_product.append([(k, v)])
lst = [dict(l) for l in product(*to_product)]
unique = []
[unique.append(item) for item in lst if item not in unique]
return unique
for i in process(my_dict):
print(i)
# {'e': {'f': 5}, 'b': 2, 'a': 1}
# {'e': {'g': 6}, 'b': 2, 'a': 1}
# {'e': {'f': 5}, 'a': 1, 'c': 3}
# {'e': {'g': 6}, 'a': 1, 'c': 3}