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

如何在不使用itertools或导入的情况下创建单列表笛卡尔积生成器?

不依赖库实现通用笛卡尔积生成器

要实现不依赖任何导入的通用笛卡尔积生成器,递归是最直接的方案——毕竟固定层数的嵌套循环没法适配任意长度的输入,递归能动态处理这种可变层数的遍历需求。

递归版生成器实现

def cartesian_product(iterables):
    # 递归终止条件:空输入返回空元组
    if not iterables:
        yield ()
        return
    # 拆分第一个可迭代对象和剩余部分
    first_iter = iterables[0]
    rest_products = cartesian_product(iterables[1:])
    # 遍历第一个对象的每个元素,和剩余部分的笛卡尔积拼接
    for item in first_iter:
        for product in rest_products:
            yield (item,) + product

测试示例

针对你给出的输入[(1,2), (2,3)],运行以下代码:

input_list = [(1, 2), (2, 3)]
for result in cartesian_product(input_list):
    print(result)

输出结果:

(1, 2)
(1, 3)
(2, 2)
(2, 3)

这个生成器还能适配更长的输入,比如[(1,2), (3,4), (5,6)],会生成所有8种组合,完全不需要修改代码。

为什么你的原代码不行?

你原来的嵌套循环是硬编码了两层循环,只能处理恰好包含两个可迭代对象的输入。如果输入列表长度变成3或更多,代码就会报错,而递归方案通过动态拆解输入、逐层拼接结果,完美解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:15:43