考慮下面的函數,它的輸出被認爲是iterables的序列的笛卡爾乘積:爲什麼我的笛卡爾產品功能不起作用?
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的評估。進出口。其值在迭代中反覆變化。 –
我知道這個問題是關於在Python中實現Cartesian產品的算法,但是爲了防止有人在這裏搜索如何在Python中執行Cartesian產品,請注意,這已經在['itertools.product']中實現了( https://docs.python.org/3/library/itertools.html#itertools.product)。 – jdehesa