Consulte product()
el itertools
módulo. Hace exactamente lo que describe.
import itertools
my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
foo(*pair)
Esto es equivalente a:
my_list = [1,2,3,4]
for x in my_list:
for y in my_list:
foo(x, y)
Editar: también hay dos funciones muy similares, permutations()
y combinations()
. Para ilustrar en qué se diferencian:
product()
genera todos los emparejamientos posibles de elementos, incluidos todos los duplicados:
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
permutations()
genera todos los ordenamientos únicos de cada par único de elementos, eliminando los x,x
duplicados:
. 1,2 1,3 1,4
2,1 . 2,3 2,4
3,1 3,2 . 3,4
4,1 4,2 4,3 .
Finalmente, combinations()
solo genera cada par único de elementos, en orden lexicográfico:
. 1,2 1,3 1,4
. . 2,3 2,4
. . . 3,4
. . . .
Las tres funciones se introdujeron en Python 2.6.
permutations()
ycombinations()
usarlosr=2
en lugar de losrepeat=2
usados en el ejemplo paraproduct()
Tuve un problema similar y encontré la solución aquí . Funciona sin tener que importar ningún módulo.
Suponiendo una lista como:
Una solución simplificada de una línea se vería así.
Todos los pares posibles , incluidos los duplicados:
Todos los pares posibles, excluidos los duplicados :
Pares únicos , donde el orden es irrelevante:
En caso de que no desee operar sino solo obtener los pares, eliminar la función
foo
y usar solo una tupla sería suficiente.Todos los pares posibles , incluidos los duplicados:
Resultado:
Todos los pares posibles, excluidos los duplicados :
Resultado:
Pares únicos , donde el orden es irrelevante:
Resultado:
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.
fuente
Si solo está llamando a una función, no puede hacerlo mucho mejor que:
Si desea recopilar una lista de los resultados de llamar a la función, puede hacer lo siguiente:
que le devolverá una lista del resultado de aplicar
foo(i, j)
a cada posible par(i, j)
.fuente
fuente