【问题标题】:generator of cartesian products of one list一个列表的笛卡尔积生成器
【发布时间】:2022-11-17 12:02:37
【问题描述】:

如何在没有 itertools 或任何导入的情况下创建一个列表的笛卡尔积生成器? 我试着做一个简单的 对于 iterable[0] 中的 x: 对于 iterable[1] 中的 y: 产量(x:y)

但它并不适用于所有情况

list = [(1,2), (2,3)]
output = (1, 2), (1,3), (2, 2), (2,3)

结果应该是这样的

【问题讨论】:

  • 为此有“itertools.product”。
  • 欢迎来到堆栈溢出!请不要将解决方案公告编辑到问题中。接受(即点击旁边的“打勾”)现有答案之一,如果有的话。如果您的解决方案尚未包含在现有答案中,您也可以创建自己的答案,甚至接受它。比较stackoverflow.com/help/self-answer
  • 您似乎认为 StackOverflow 可以为您提供答案。那是误会,请拍tour

标签: python


【解决方案1】:

使用itertools.product

from itertools import product
for i in product([1, 2, 3], [4, 5, 6]):
    print(i)
# (1, 4) (1, 5) (1, 6) (2, 4) (2, 5) (2, 6) (3, 4) (3, 5) (3, 6) 

没有 itertools 你可以像这样使用递归

from collections.abc import Iterable
def generate_product(*args):
    if not args:
        return
    if len(args) == 1:
        return (i for i in args[0])
    i = args[0]
    return ((j, *k) if isinstance(k, Iterable) else (j,k) for k in generate_product(*args[1:]) for j in i )

for i in generate_product([1, 1], [2, 2]):
    print(i, end=" ")
for i in generate_product('BC', 'CD', 'DF'):
    print(i, end=" ")
# (1, 2) (1, 2) (1, 2) (1, 2)
# ('B', 'C', 'D') ('C', 'C', 'D') ('B', 'D', 'D') ('C', 'D', 'D') ('B', 'C', 'F') ('C', 'C', 'F') ('B', 'D', 'F') ('C', 'D', 'F')

【讨论】:

  • 如果没有 itertools,有没有办法做到这一点?这就是我的目标
  • @willywonka 我添加了没有 itertools 的实现
  • 你如何在不导入任何东西的情况下做到这一点?
  • 您需要通过递归来了解它是如何构建的。
猜你喜欢
  • 2016-10-08
  • 2021-09-05
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2012-01-03
  • 2012-03-24
  • 2016-05-07
  • 2013-11-25
相关资源
最近更新 更多