
使用 python 标准库 `itertools.product` 可高效生成任意数量子列表的笛卡尔积,避免硬编码嵌套循环,支持动态长度输入。
在处理多维组合问题时,例如从多个列表中各取一个元素构成所有可能的元组(即笛卡尔积),若列表数量 n 在运行时才确定,传统 n 层 for 循环将无法实现。此时,itertools.product 是最简洁、高效且符合 Python 风格的解决方案。
itertools.product 接收多个可迭代对象,并返回其笛卡尔积的迭代器。配合解包操作符 *,可直接将“列表的列表”展开为独立参数:
import itertools
# 示例输入:任意长度的列表嵌套(每个子列表可含不同元素)
data = [
['a', 'b', 'c'],
['p', 'q', 'r'],
['x', 'y', 'z']
]
# 生成所有组合(返回元组形式)
combinations = list(itertools.product(*data))
# 若需列表而非元组(如题目示例中为 list of lists)
combinations_as_lists = [list(combo) for combo in combinations]
print(combinations_as_lists[:6]) # 查看前6个结果
# 输出:
# [['a', 'p', 'x'], ['a', 'p', 'y'], ['a', 'p', 'z'],
# ['a', 'q', 'x'], ['a', 'q', 'y'], ['a', 'q', 'z']]✅ 关键优势:
- 动态适配:无论 data 包含 2 个还是 20 个子列表,代码完全不变;
- 内存友好:itertools.product 返回迭代器,可逐个消费,避免一次性加载全部结果(对大数据集尤其重要);
- 类型灵活:子列表可为字符串、数字、对象等任意可迭代类型(注意:字符串会被视为字符序列,如需整串参与组合,请用 [string] 包裹)。
⚠️ 注意事项:
- 结果默认为 tuple 类型;如需 list,请显式转换(如上例所示);
- 笛卡尔积结果总数为各子列表长度的乘积(len(list1) × len(list2) × ...),请确保数据规模可控,避免内存溢出;
- 若需去重或添加过滤逻辑(如跳过特定组合),可在生成后链式处理:
valid_combos = [list(c) for c in itertools.product(*data) if condition(c)]
总之,itertools.product(*lists) 是解决“未知层数的组合枚举”问题的标准答案——简洁、健壮、高性能,是 Python 工程实践中推荐的惯用写法。










