考虑以下函数,其输出应该是一系列迭代的笛卡尔积:
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)]
为什么是这个而不是笛卡尔积?