Miałem podobny problem i znaleźć rozwiązanie tutaj . Działa bez konieczności importowania żadnego modułu.
Przypuśćmy, że lista taka jak:
people = ["Lisa","Pam","Phil","John"]
Tak wyglądałoby uproszczone rozwiązanie jednowierszowe.
Wszystkie możliwe pary , w tym duplikaty:
result = [foo(p1, p2) for p1 in people for p2 in people]
Wszystkie możliwe pary, z wyłączeniem duplikatów :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Unikalne pary , w których kolejność nie ma znaczenia:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Jeśli nie chcesz operować, ale po prostu uzyskać pary, foowystarczy usunąć funkcję i użyć tylko krotki.
Wszystkie możliwe pary , w tym duplikaty:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Wynik:
('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')
Wszystkie możliwe pary, z wyłączeniem duplikatów :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Wynik:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Unikalne pary , w których kolejność nie ma znaczenia:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Wynik:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Edycja: Po przeróbce mającej na celu uproszczenie tego rozwiązania zdałem sobie sprawę, że jest to to samo podejście, co Adam Rosenfield. Mam nadzieję, że szersze wyjaśnienie pomoże niektórym lepiej to zrozumieć.