如何从多组坐标子列表生成所有可能路径?
生成所有可能路径的解决方案
问题描述
给定一个嵌套列表,例如:
l = [[[0, 4], [0, 2]], [[1, 3], [1, 6], [1, 2]]]
需要生成包含所有可能路径的列表,每个路径由从每个子列表中选取一个元素组成,预期输出为:
l_paths = [[[0, 4], [1, 3]], [[0, 4], [1, 6]], [[0, 4], [1, 2]], [[0, 2], [1, 3]], [[0, 2], [1, 6]], [[0, 2], [1, 2]]]
你之前的代码仅能获取第一条路径,下面提供两种通用解决方案。
方案一:使用标准库itertools.product(推荐)
这个问题本质是求多个子列表的笛卡尔积,Python标准库的itertools.product专门用于生成这种组合,代码简洁高效:
import itertools l = [[[0, 4], [0, 2]], [[1, 3], [1, 6], [1, 2]]] # 用*l将嵌套列表拆分为多个参数传入product,再将每个元组转为列表 l_paths = [list(path) for path in itertools.product(*l)] print(l_paths)
执行后会直接生成符合要求的所有路径列表,该方法支持任意长度的输入嵌套列表。
方案二:递归实现(适合理解原理)
如果不想依赖标准库,可以用递归的方式手动生成所有组合:
def generate_paths(lists): # 递归终止条件:没有子列表时返回空路径 if not lists: return [[]] result = [] # 遍历当前子列表的每个元素 for item in lists[0]: # 递归处理剩余子列表,将当前元素与后续路径组合 for path in generate_paths(lists[1:]): result.append([item] + path) return result l = [[[0, 4], [0, 2]], [[1, 3], [1, 6], [1, 2]]] l_paths = generate_paths(l) print(l_paths)
这种方法通过逐层拆解嵌套列表,将每个元素与后续子列表的所有路径进行组合,最终得到全量路径。
原代码问题分析
你之前的代码仅遍历每个子列表并取第一个元素加入路径,没有对所有元素进行组合遍历,因此只能生成一条路径。上述两种方案都解决了这个问题,实现了全路径的生成。
内容的提问来源于stack exchange,提问作者ossan05
相关产品推荐
相关产品推荐

