假设我有这个字典
obj = {'layerA1':'string','layerA2':{'layerB1':{'layerC1':{},'layerC2':{}},
'layerB2':{}}}
我需要返回
['layerA2','layberB1','layerC1']
['layerA2','layerB1','layerC2']
['layerA2','layerB2']
不管字典有多深,它都应该工作。目前尝试与一些递归函数,但我似乎不能得到它的权利。我现在拥有的是:
obj = {'layerA1':'string','layerA2':{'layerB1':{'layerC1':{},'layerC2':{}},
'layerB2':{}}}
hierarchy_list = []
def find_hierachy(param):
some_list = []
for key, value in param.items():
if type(param[key]) is dict:
some_list.append(key)
hierarchy_list.append(some_list)
find_hierachy(param[key])
find_hierachy(obj)
print(hierarchy_list)
[['layerA2'], ['layerB1', 'layerB2'], ['layerC1', 'layerC2'], ['layerC1', 'layerC2'], ['layerB1', 'layerB2']]
我不知道如何让它返回每个由键组成的层次路径
正如您在代码中注意到的那样,您需要跟踪到目前为止所采取的路径,这通常被称为前缀。通过存储前缀并传递它,我们可以跟踪前面的键。重要的是要记住python中的默认变量应该是不可变的(元组),除非你知道在使用递归时可变对象会发生什么。
answer = []
def hierarchy(dictionary, prefix=()):
for key, value in dictionary.items():
if isinstance(value, dict) and value:
hierarchy(value, (*prefix, key))
else:
answer.append((*prefix, key))
如果您希望最终答案是一个列表,您可以遍历answers
并将它们强制转换为列表,或者将列表作为前缀发送。这要求我们将列表复制到层次结构的下一层。这是使用[*prefix, key]
来完成的,它会生成列表的新副本。
obj = {'layerA1': 'string', 'layerA2': {'layerB1': {'layerC1': {}, 'layerC2': {}},
'layerB2': {}}}
if __name__ == '__main__':
answer = []
def hierarchy(dictionary, prefix=None):
prefix = prefix if prefix is not None else []
for key, value in dictionary.items():
if isinstance(value, dict) and value:
hierarchy(value, [*prefix, key])
else:
answer.append([*prefix, key])
hierarchy(obj)
print(answer)
输出[['layerA1'], ['layerA2', 'layerB1', 'layerC1'], ['layerA2', 'layerB1', 'layerC2'], ['layerA2', 'layerB2']]
注意:
可以使用isinstance(obj, type)
进行类型检查,这是type(obj) is type
的首选方法。