Die einfachste rekursive Definition des kartesischen Produkts, die ich mir vorstellen kann, sieht so aus. Sie können sehen, dass wie bei Ihnen, das hat eine Schleife - eigentlich zwei Schleifen in einem Listenverständnis eingebettet. Im Gegensatz zu Ihnen, kann damit umgehen zwei oder mehr Sequenzen:
def product(*seqs):
if not seqs:
return [[]]
else:
return [[x] + p for x in seqs[0] for p in product(*seqs[1:])]
Hier ist ein Freilos, um Ihnen einen Eindruck davon, wie es funktioniert. Per Definition ist das kartesische Produkt einer leeren Sequenz (product()
) eine Sequenz, die die leere Sequenz enthält. Mit anderen Worten, product()
== [[]]
- see here für warum.
Nehmen wir jetzt an, wir rufen product([1, 2, 3])
- seqs
ist nicht leer, so dass der Rückgabewert das Ergebnis des Listenverständnisses ist. In diesem Fall product(*seqs[1:])
== == product(*[])
product()
== [[]]
, so dass die Liste Verständnis entspricht dies:
[[x] + p for x in seqs[0] for p in [[]] ]
, die für alle von ihnen entspricht:
[[x] + [] for x in seqs[0]]
[[x] for x in seqs[0]]
[[1], [2], [3]]
andere Sequenz Hinzufügen, wir haben product([4, 5, 6], [1, 2, 3])
. Jetzt sieht das Listenverständnis so aus:
[[x] + p for x in [4, 5, 6] for p in product(*seqs[1:])]
[[x] + p for x in [4, 5, 6] for p in [[1], [2], [3]]]
[[4, 1], [4, 2], [4, 3], [5, 1], [5, 2], [5, 3], [6, 1], [6, 2], [6, 3]]
Das Muster fährt von dort fort; für jede zusätzliche Sequenz wird jeder der Werte in der Sequenz jedem der Werte in dem kartesischen Produkt der folgenden Sequenzen vorangestellt.
Wissen Sie über 'itertools.product'? –
@LevLevitsky Mein schlechtes, editierte die Frage – gizgok
Ich denke, dass Ihr abschließender 'Mähdrescheranruf' eine 'Rückkehr' vor ihm benötigt. – DSM