如何用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原生类型检测,不会因对象自身属性影响拆解逻辑。
嵌套列表的替代表示方案
如果后续需要适配印度语系研究的定制化需求(比如给节点加词性标注、语义标签、路径筛选规则),可以将纯嵌套列表替换为带类型标记的多叉树邻接表结构,相比纯嵌套列表有两个核心优势:
- 不存在类型冲突:不需要靠列表嵌套关系隐式判断AND/OR角色,不需要区分“元素是列表还是普通对象”,避免存储的语言对象本身是列表结构时拆解逻辑出错
- 扩展性更强:可以给每个节点额外存储自定义属性(比如词源、语域、语法属性),路径生成逻辑保持原有递归思路即可,语义更清晰
简单的邻接表节点实现参考:
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
相关产品推荐
相关产品推荐

