如何从多维(深度未知)python 字典中递归删除每个键?

时间:2021-05-06 10:28:30

标签: python

我正在尝试通过检索字典以从字典中删除每个键来测试服务器在缺少参数时是否正常:

data = {'a':'b','c':'d','e':{'aa':'bb'}}
for i in range(len(data)):    
  print "removed ans:",dict(data.items()[:i] + data.items()[i+1:])

答案是这样的:

removed ans: {'c': 'd', 'e': {'aa': 'bb', 'cc': 'dd'}}
removed ans: {'a': 'b', 'e': {'aa': 'bb', 'cc': 'dd'}}
removed ans: {'a': 'b', 'c': 'd'}

但我还需要删除“e”中的每个项目:

removed ans: {'c': 'd', 'e': {'aa': 'bb', 'cc': 'dd'}}
removed ans: {'a': 'b', 'e': {'aa': 'bb', 'cc': 'dd'}}
removed ans: {'a': 'b', 'c': 'd'}
removed ans: {'c': 'd', 'e': {'cc': 'dd'}}
removed ans: {'a': 'b', 'e': {'aa': 'bb'}}

我想我需要在一个函数中完成它,但是

  1. 如何在函数中每次返回不同的答案?

  2. 如何进入多维字典?

2 个答案:

答案 0 :(得分:2)

这可以通过递归生成器函数来完成:

def remove_next_key(my_dict):
    for key, val in my_dict.items():
        new_dict = dict(my_dict)
        if isinstance(val, dict):
            for nested_dict in remove_next_key(val):
                new_dict[key] = nested_dict
                yield new_dict
        new_dict.pop(key)
        yield new_dict

start_dict =  {'a':'b','c':'d','e':{'aa':'bb', 'cc': 'dd'}}

for sub_dict in remove_next_key(start_dict):
    print(sub_dict)

输出:

{'c': 'd', 'e': {'aa': 'bb', 'cc': 'dd'}}
{'a': 'b', 'e': {'aa': 'bb', 'cc': 'dd'}}
{'a': 'b', 'c': 'd', 'e': {'cc': 'dd'}}
{'a': 'b', 'c': 'd', 'e': {'aa': 'bb'}}
{'a': 'b', 'c': 'd'}

答案 1 :(得分:-1)

这可以使用递归生成器来完成。

data = {'a': 'b', 'c': 'd', 'e': {'aa': 'bb', 'cc': 'dd'}}

def get_next_test_data(original_data):
    for property in original_data:
        modified_data = dict(original_data)
        modified_data.pop(property)
        yield modified_data
        if isinstance(original_data[property], dict):
            for new_val in get_next_test_data(original_data[property]):
                modified_data = dict(original_data)
                modified_data[property] = new_val
                yield modified_data

for output in get_next_test_data(data):
    print(output)
print("all test cases posted")

以上代码输出:

{'c': 'd', 'e': {'aa': 'bb', 'cc': 'dd'}}
{'a': 'b', 'e': {'aa': 'bb', 'cc': 'dd'}}
{'a': 'b', 'c': 'd'}
{'a': 'b', 'c': 'd', 'e': {'cc': 'dd'}}
{'a': 'b', 'c': 'd', 'e': {'aa': 'bb'}}
"all test cases posted"