Tuve un problema similar y encontré la solución here. 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 posibles pares, incluyendo duplicados:
result = [foo(p1, p2) for p1 in people for p2 in people]
todos los posibles pares, con exclusión de 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 pero solo para obtener los pares, eliminar la función foo
y usar solo una tupla sería suficiente.
todos los posibles pares, incluyendo duplicados:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Resultados:
('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 posibles pares, con exclusión de 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 reanudación para simplificar esta solución, me di cuenta que es el mismo enfoque que Adam Rosenfield. Espero que la explicación más grande ayude a algunos a entenderlo mejor.
No sabía acerca de itertools, esto es perfecto. Gracias ! – GuiSim
Extraño, cuando ejecuto itertools.product (mi_lista, 2), se queja de que int no se puede llamar. Funciona una vez que lo cambio a: itertools.product (mi_lista, repeat = 2) – ojrac
(usando Python 2.6.2) – ojrac