Ho avuto un problema simile e ho trovato la soluzione qui . Funziona senza dover importare alcun modulo.
Supponendo un elenco come:
people = ["Lisa","Pam","Phil","John"]
Una soluzione a una riga semplificata sarebbe simile a questa.
Tutte le possibili coppie , inclusi i duplicati:
result = [foo(p1, p2) for p1 in people for p2 in people]
Tutte le possibili coppie, esclusi i duplicati :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Coppie uniche , dove l'ordine è irrilevante:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Nel caso in cui non si desideri operare ma solo per ottenere le coppie, foosarebbe sufficiente rimuovere la funzione e utilizzare solo una tupla.
Tutte le possibili coppie , inclusi i duplicati:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Risultato:
('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')
Tutte le possibili coppie, esclusi i duplicati :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Risultato:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Coppie uniche , dove l'ordine è irrilevante:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Risultato:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Modifica: dopo la rielaborazione per semplificare questa soluzione, ho capito che è lo stesso approccio di Adam Rosenfield. Spero che la spiegazione più ampia aiuti alcuni a capirla meglio.