Tuve un problema similar y encontré la solución aquí . Funciona sin tener que importar ningún módulo.
Suponiendo una lista como:
people = ["Lisa","Pam","Phil","John"]
Una solución simplificada de una línea se vería así.
Todos los pares posibles , incluidos los duplicados:
result = [foo(p1, p2) for p1 in people for p2 in people]
Todos los pares posibles, excluidos los duplicados :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Pares únicos , donde el orden es irrelevante:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
En caso de que no desee operar sino solo obtener los pares, eliminar la función fooy usar solo una tupla sería suficiente.
Todos los pares posibles , incluidos los duplicados:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Resultado:
('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')
Todos los pares posibles, excluidos los duplicados :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Resultado:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Pares únicos , donde el orden es irrelevante:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Resultado:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Editar: Después de la reelaboración para simplificar esta solución, me di cuenta de que es el mismo enfoque que Adam Rosenfield. Espero que la explicación más amplia ayude a algunos a entenderlo mejor.