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

如何用Python将类树结构的多维嵌套列表解析为所有组合形式的行?

多维嵌套列表全路径组合拆解实现

核心拆解逻辑

结合你给出的三个输入输出示例,当前嵌套列表的语义为AND序列与OR分支组交替嵌套:

  • 最外层列表为AND序列:序列内的非列表元素为所有路径的固定组成部分,序列内的嵌套列表为OR分支组
  • OR分支组内的非列表元素为独立路径终点,组内的嵌套列表为新的AND序列
    递归拆解时按照角色交替切换的逻辑遍历每个元素,最终生成所有独立路径行。

递归实现代码

def generate_all_paths(structure, mode="AND", initial_paths=None):
    if initial_paths is None:
        initial_paths = [[]]
    if mode == "AND":
        current_paths = initial_paths.copy()
        for item in structure:
            if isinstance(item, list):
                # 嵌套列表切换为OR模式,以当前累积路径为前缀
                current_paths = generate_all_paths(
                    item, mode="OR", initial_paths=current_paths
                )
            else:
                # 普通对象追加到所有现有路径末尾
                current_paths = [path + [item] for path in current_paths]
        return current_paths
    elif mode == "OR":
        result = []
        for item in structure:
            if isinstance(item, list):
                # 嵌套列表切换为AND模式,以OR组的前缀为初始路径
                branch_paths = generate_all_paths(
                    item, mode="AND", initial_paths=initial_paths
                )
                result.extend(branch_paths)
            else:
                # 普通对象为独立分支,追加到前缀形成完整路径
                for prefix in initial_paths:
                    result.append(prefix + [item])
        return result

效果验证

代码运行结果与你给出的示例完全匹配:

  • 输入1:["a", "b", ["c", "d"]] → 输出[['a','b','c'], ['a','b','d']]
  • 输入2:["a", "b", ["c", ["d", ["e", "f"]]]] → 输出[['a','b','c'], ['a','b','d','e'], ['a','b','d','f']]
  • 输入3:["a", ["b", "c"], ["d", "e"]] → 输出[['a','b','d'], ['a','b','e'], ['a','c','d'], ['a','c','e']]

注:代码支持直接替换为你实际使用的Python对象,因为列表类型判断基于Python原生类型检测,不会因对象自身属性影响拆解逻辑。


嵌套列表的替代表示方案

如果后续需要适配印度语系研究的定制化需求(比如给节点加词性标注、语义标签、路径筛选规则),可以将纯嵌套列表替换为带类型标记的多叉树邻接表结构,相比纯嵌套列表有两个核心优势:

  1. 不存在类型冲突:不需要靠列表嵌套关系隐式判断AND/OR角色,不需要区分“元素是列表还是普通对象”,避免存储的语言对象本身是列表结构时拆解逻辑出错
  2. 扩展性更强:可以给每个节点额外存储自定义属性(比如词源、语域、语法属性),路径生成逻辑保持原有递归思路即可,语义更清晰
    简单的邻接表节点实现参考:
class TreeNode:
    def __init__(self, value, node_type):
        # node_type 标记节点是AND序列、OR分支还是普通叶子节点
        self.value = value
        self.node_type = node_type
        self.children = []

内容的提问来源于stack exchange,提问作者PIngu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 10:54:03