首页 > 解决方案 > 如何从多维(深度未知)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. 我怎样才能去多维字典?

标签: python

解决方案


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

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'}

推荐阅读