【发布时间】:2017-12-18 01:42:06
【问题描述】:
考虑以下函数,其输出应该是一系列可迭代对象的笛卡尔积:
def cart(*iterables):
out = ((e,) for e in iterables[0])
for iterable in iterables[1:]:
out = (e1 + (e2,) for e1 in out for e2 in iterable)
return out
当生成器推导被列表推导替换时工作正常。当只有 2 个可迭代对象时也可以使用。但是当我尝试
print(list(cart([1, 2, 3], 'ab', [4, 5])))
我明白了
[(1, 4, 4), (1, 4, 5), (1, 5, 4), (1, 5, 5),
(2, 4, 4), (2, 4, 5), (2, 5, 4), (2, 5, 5),
(3, 4, 4), (3, 4, 5), (3, 5, 4), (3, 5, 5)]
为什么是这个而不是笛卡尔积?
【问题讨论】:
-
您可以将中间结果存储在内存中(例如行之有效的列表方法),而不是推迟对那个 gen 的评估。 exp。其值在迭代中不断变化。
-
我知道这个问题是关于在 Python 中实现笛卡尔积的算法,但以防万一有人最终在这里搜索如何在 Python 中做笛卡尔积,请注意这已经在 @ 中实现987654321@.
标签: python cartesian-product generator-expression