Check out product()
im itertools
Modul. Es macht genau das, was Sie beschreiben.
import itertools
my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
foo(*pair)
Dies entspricht:
my_list = [1,2,3,4]
for x in my_list:
for y in my_list:
foo(x, y)
Bearbeiten: Es gibt auch zwei sehr ähnliche Funktionen, permutations()
und combinations()
. Um zu veranschaulichen, wie sie sich unterscheiden:
product()
generiert jede mögliche Paarung von Elementen, einschließlich aller Duplikate:
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
permutations()
generiert alle eindeutigen Ordnungen jedes eindeutigen Elementpaars, wobei die x,x
Duplikate entfernt werden:
. 1,2 1,3 1,4
2,1 . 2,3 2,4
3,1 3,2 . 3,4
4,1 4,2 4,3 .
Schließlich wird combinations()
nur jedes einzelne Elementpaar in lexikografischer Reihenfolge generiert:
. 1,2 1,3 1,4
. . 2,3 2,4
. . . 3,4
. . . .
Alle drei Funktionen wurden in Python 2.6 eingeführt.
permutations()
undcombinations()
Verwendungr=2
anstelle derrepeat=2
für am Beispiel verwendetproduct()
Ich hatte ein ähnliches Problem und die Lösung gefunden hier . Es funktioniert, ohne dass ein Modul importiert werden muss.
Angenommen, eine Liste wie:
Eine vereinfachte einzeilige Lösung würde so aussehen.
Alle möglichen Paare , einschließlich Duplikate:
Alle möglichen Paare, ausgenommen Duplikate :
Einzigartige Paare , bei denen die Reihenfolge keine Rolle spielt:
Für den Fall, dass Sie nicht operieren möchten, sondern nur die Paare erhalten
foo
möchten, reicht es aus , die Funktion zu entfernen und nur ein Tupel zu verwenden.Alle möglichen Paare , einschließlich Duplikate:
Ergebnis:
Alle möglichen Paare, ausgenommen Duplikate :
Ergebnis:
Einzigartige Paare , bei denen die Reihenfolge keine Rolle spielt:
Ergebnis:
Bearbeiten: Nach der Überarbeitung zur Vereinfachung dieser Lösung wurde mir klar, dass es der gleiche Ansatz ist wie Adam Rosenfield. Ich hoffe, die größere Erklärung hilft einigen, es besser zu verstehen.
quelle
Wenn Sie nur eine Funktion aufrufen, können Sie nicht viel besser machen als:
Wenn Sie eine Liste der Ergebnisse des Aufrufs der Funktion erfassen möchten, haben Sie folgende Möglichkeiten:
Daraufhin erhalten Sie eine Liste der Ergebnisse der Anwendung
foo(i, j)
auf jedes mögliche Paar(i, j)
.quelle
quelle