You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套字典快速转换为列表的列表?

解决嵌套字典转路径列表的问题

嘿,我完全懂你为啥递归写得不顺——这种嵌套字典的路径遍历很容易在终止条件或者路径传递上踩坑。我给你两种靠谱的实现方法,不管是递归还是迭代,都能完美输出你想要的结果:

方法一:递归回溯法

这应该是最直观的思路,核心是回溯——遍历每个节点时记录当前路径,处理完子节点后再回溯到父节点,继续处理其他子节点。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:29:53