Ich hatte ein ähnliches Problem und die Lösung gefunden hier . Es funktioniert, ohne dass ein Modul importiert werden muss.
Angenommen, eine Liste wie:
people = ["Lisa","Pam","Phil","John"]
Eine vereinfachte einzeilige Lösung würde so aussehen.
Alle möglichen Paare , einschließlich Duplikate:
result = [foo(p1, p2) for p1 in people for p2 in people]
Alle möglichen Paare, ausgenommen Duplikate :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Einzigartige Paare , bei denen die Reihenfolge keine Rolle spielt:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Für den Fall, dass Sie nicht operieren möchten, sondern nur die Paare erhalten foomöchten, reicht es aus , die Funktion zu entfernen und nur ein Tupel zu verwenden.
Alle möglichen Paare , einschließlich Duplikate:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Ergebnis:
('Lisa', 'Lisa')
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Pam')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'Phil')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
('John', 'John')
Alle möglichen Paare, ausgenommen Duplikate :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Ergebnis:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Einzigartige Paare , bei denen die Reihenfolge keine Rolle spielt:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Ergebnis:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
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.