Betrachten Sie die folgende Funktion, deren Ausgang soll das Kreuzprodukt aus einer Folge von Iterables sein:Warum funktioniert meine kartesische Produktfunktion nicht?
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
feine Arbeiten, wenn Generator Comprehensions mit Listenkomprehensionen ersetzt werden. Funktioniert auch, wenn nur 2 Iterables vorhanden sind. Aber wenn ich versuche
print(list(cart([1, 2, 3], 'ab', [4, 5])))
ich
[(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)]
Warum dies und nicht das kartesische Produkt?
Sie könnten Zwischenergebnisse im Speicher speichern (wie der Listenansatz, der funktioniert) und ihre Auswertung nicht mit diesem Gen verzögern. exp. deren Werte sich wiederholt über Iterationen hinweg ändern. –
Ich weiß, dass es bei dieser Frage darum geht, den Algorithmus für kartesische Produkte in Python zu implementieren, aber für den Fall, dass jemand hier nach einem kartesischen Produkt in Python sucht, ist dies bereits in ['itertools.product'] implementiert (https://docs.python.org/3/library/itertools.html#itertools.product). – jdehesa