Vérifiez product()
dans le itertools
module. Il fait exactement ce que vous décrivez.
import itertools
my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
foo(*pair)
Cela équivaut à:
my_list = [1,2,3,4]
for x in my_list:
for y in my_list:
foo(x, y)
Edit: Il existe également deux fonctions très similaires, permutations()
et combinations()
. Pour illustrer leurs différences:
product()
génère toutes les paires d'éléments possibles, y compris tous les doublons:
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()
génère tous les ordres uniques de chaque paire d'éléments unique, éliminant les x,x
doublons:
. 1,2 1,3 1,4
2,1 . 2,3 2,4
3,1 3,2 . 3,4
4,1 4,2 4,3 .
Enfin, combinations()
ne génère que chaque paire unique d'éléments, dans l'ordre lexicographique:
. 1,2 1,3 1,4
. . 2,3 2,4
. . . 3,4
. . . .
Ces trois fonctions ont été introduites dans Python 2.6.
permutations()
etcombinations()
utiliserr=2
à la place derepeat=2
utilisé sur l'exemple pourproduct()
J'ai eu un problème similaire et j'ai trouvé la solution ici . Cela fonctionne sans avoir à importer de module.
Supposons une liste comme:
Une solution simplifiée en une ligne ressemblerait à ceci.
Toutes les paires possibles , y compris les doublons:
Toutes les paires possibles, à l'exclusion des doublons :
Paires uniques , où l'ordre n'est pas pertinent:
Au cas où vous ne voudriez pas opérer mais juste pour obtenir les paires, supprimer la fonction
foo
et utiliser juste un tuple suffirait.Toutes les paires possibles , y compris les doublons:
Résultat:
Toutes les paires possibles, à l'exclusion des doublons :
Résultat:
Paires uniques , où l'ordre n'est pas pertinent:
Résultat:
Edit: Après la refonte pour simplifier cette solution, j'ai réalisé que c'était la même approche qu'Adam Rosenfield. J'espère que l'explication plus large aidera certains à mieux la comprendre.
la source
Si vous appelez simplement une fonction, vous ne pouvez pas vraiment faire mieux que:
Si vous souhaitez collecter une liste des résultats de l'appel de la fonction, vous pouvez faire:
qui vous renverra une liste du résultat de l'application
foo(i, j)
à chaque paire possible(i, j)
.la source
la source