Confira product()
no itertools
módulo. Faz exatamente o que você descreve.
import itertools
my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
foo(*pair)
Isso é equivalente a:
my_list = [1,2,3,4]
for x in my_list:
for y in my_list:
foo(x, y)
Edit: Existem duas funções muito semelhantes também, permutations()
e combinations()
. Para ilustrar como eles diferem:
product()
gera todos os pares de elementos possíveis, incluindo todas as duplicatas:
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()
gera todas as ordens exclusivas de cada par exclusivo de elementos, eliminando as x,x
duplicatas:
. 1,2 1,3 1,4
2,1 . 2,3 2,4
3,1 3,2 . 3,4
4,1 4,2 4,3 .
Por fim, combinations()
gera apenas cada par único de elementos, em ordem lexicográfica:
. 1,2 1,3 1,4
. . 2,3 2,4
. . . 3,4
. . . .
Todas as três funções foram introduzidas no Python 2.6.
permutations()
ecombinations()
usarr=2
em vez derepeat=2
usados no exemplo paraproduct()
Tive um problema semelhante e encontrei a solução aqui . Funciona sem a necessidade de importar nenhum módulo.
Supondo uma lista como:
Uma solução simplificada de uma linha ficaria assim.
Todos os pares possíveis , incluindo duplicatas:
Todos os pares possíveis, excluindo duplicatas :
Pares únicos , onde a ordem é irrelevante:
Caso você não queira operar, mas apenas pegar os pares,
foo
bastaria retirar a função e usar apenas uma tupla.Todos os pares possíveis , incluindo duplicatas:
Resultado:
Todos os pares possíveis, excluindo duplicatas :
Resultado:
Pares únicos , onde a ordem é irrelevante:
Resultado:
Edit: Após o retrabalho para simplificar esta solução, percebi que é a mesma abordagem que Adam Rosenfield. Espero que a explicação mais ampla ajude alguns a entendê-la melhor.
fonte
Se você está apenas chamando uma função, você não pode fazer muito melhor do que:
Se quiser coletar uma lista dos resultados da chamada da função, você pode fazer:
que irá retornar uma lista do resultado da aplicação
foo(i, j)
para cada par possível(i, j)
.fonte
fonte