如何将嵌套字典快速转换为列表的列表?
解决嵌套字典转路径列表的问题
嘿,我完全懂你为啥递归写得不顺——这种嵌套字典的路径遍历很容易在终止条件或者路径传递上踩坑。我给你两种靠谱的实现方法,不管是递归还是迭代,都能完美输出你想要的结果:
方法一:递归回溯法
这应该是最直观的思路,核心是回溯——遍历每个节点时记录当前路径,处理完子节点后再回溯到父节点,继续处理其他子节点。
def dict_to_paths(nested_dict): result = [] def traverse(current_path, current_node): # 遇到空字典就停止,把当前路径存入结果 if not current_node: result.append(current_path.copy()) return # 遍历当前节点的所有子键 for key, child in current_node.items(): current_path.append(key) traverse(current_path, child) current_path.pop() # 回溯:移除当前键,准备处理下一个兄弟节点 traverse([], nested_dict) return result # 测试你的输入字典 input_dict = { "g": { "o": {} }, "h": { "p": {} }, "e": { "v": {}, "m": { "s": {} } }, "f": { "n": {} }, "a": { "i": {} }, "d": { "u": {}, "l": { "r": {} } }, "b": { "j": {} }, "c": { "t": {}, "k": { "q": { "z": {} } } } } print(dict_to_paths(input_dict))
逻辑说明:
- 递归函数
traverse接收两个参数:current_path(当前已遍历的路径)和current_node(当前处理的字典节点)。 - 当
current_node是空字典时,说明已经走到路径终点,把当前路径的副本存入结果(必须用copy(),不然后续回溯会修改这个列表)。 - 遍历每个子键时,先把键加入路径,递归处理子节点,处理完后再把键从路径中移除(回溯),这样就能正确处理同一层级的多个子节点(比如
e下面的v和m)。
方法二:迭代栈模拟法
如果你的字典嵌套非常深,递归可能会触发Python的递归深度限制,这时候用栈模拟递归就更稳妥:
def dict_to_paths_iterative(nested_dict): result = [] # 栈中存储元组:(当前路径, 当前处理的节点) stack = [([], nested_dict)] while stack: current_path, current_node = stack.pop() # 遇到空字典,记录路径 if not current_node: result.append(current_path) continue # 注意:栈是后进先出,反转键的顺序可以保持和递归一致的输出顺序 for key in reversed(current_node.keys()): new_path = current_path + [key] stack.append((new_path, current_node[key])) return result # 测试 print(dict_to_paths_iterative(input_dict))
逻辑说明:
- 用栈保存每个待处理的节点和对应的路径,每次弹出栈顶元素进行处理。
- 如果当前节点是空字典,直接把路径存入结果;否则把每个子节点和新路径(当前路径+子键)压入栈。
- 因为栈是后进先出,所以反转键的顺序可以让输出顺序和递归方法完全一致,如果你不介意顺序,也可以去掉
reversed()。
输出结果
两种方法都会输出你需要的格式:
[['g', 'o'], ['h', 'p'], ['e', 'v'], ['e', 'm', 's'], ['f', 'n'], ['a', 'i'], ['d', 'u'], ['d', 'l', 'r'], ['b', 'j'], ['c', 't'], ['c', 'k', 'q', 'z']]
内容的提问来源于stack exchange,提问作者Abhishek Thakur
相关产品推荐
相关产品推荐

