Das kartesische Produkt von a dictionary of Listen
Ich versuche, code zu schreiben, zu testen, das kartesische Produkt von einer Reihe von Eingangsparametern.
Habe ich mir angeschaut itertools
, aber seine product
Funktion ist nicht genau das, was ich will. Gibt es einen einfachen, offensichtlichen Weg, um ein Wörterbuch mit einer beliebigen Anzahl von Schlüssel und eine beliebige Anzahl von Elementen in jedem Wert, und dann liefern Sie ein Wörterbuch mit der nächsten permutation?
Eingang:
options = {"number": [1,2,3], "color": ["orange","blue"] }
print list( my_product(options) )
Beispiel-Ausgabe:
[ {"number": 1, "color": "orange"},
{"number": 1, "color": "blue"},
{"number": 2, "color": "orange"},
{"number": 2, "color": "blue"},
{"number": 3, "color": "orange"},
{"number": 3, "color": "blue"}
]
- Ich bin mir ziemlich sicher, Sie brauchen keine Bibliothek, dies zu tun, aber ich weiß nicht, Python ganz gut genug zu beantworten. Ich denke, die Liste Verstehens sind der trick.
- Ich Frage, ob gibt es eine ready-made-generator, der leicht angepasst werden kann, so etwas zu tun. Liste Verstehens sind überhaupt nicht relevant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, danke @dfan für mich zu sagen, ich war an der falschen Stelle suchen. Ich habe es jetzt:
BEARBEITEN: nach Jahren mehr Python Erfahrung, ich denke, eine bessere Lösung zu akzeptieren
kwargs
eher als ein Wörterbuch der Eingänge; der Aufruf Arbeitsweise ist Analog zu der des ursprünglichenitertools.product
. Auch ich denke, dass das schreiben einer generator-Funktion, anstatt eine Funktion zurückgibt, die einen generator-Ausdruck, lässt den code übersichtlicher. Also:und wenn Sie brauchen, um passieren in einem dict,
list(product_dict(**mydict))
. Die einzige Bemerkenswerte änderung mitkwargs
eher als eine beliebige Eingabe-Klasse ist, dass es verhindert, dass die Schlüssel/Werte aus bestellt, zumindest bis Python 3.6.**kwargs
zu senden, um eine Funktion, übermap
ist, dann ist es ähnlich wie eine Menge von geschachtelten for-Schleifen. Der Unterschied ist, dass Sie keine Garantie für die Schleife auf der Außenseite, und die loop ist auf der Innenseite.Python-3-version von Seths Antwort.
Durch die Art und Weise, dies ist nicht eine permutation. Eine permutation ist eine Neuordnung der Liste. Dies ist eine Aufzählung der möglichen Auswahl aus Listen.
Edit: nach erinnern, dass es als ein Kartesisches Produkt, ich kam mit dieser:
Ergebnisse in