J'ai eu un problème similaire et j'ai trouvé la solution aquí . Il fonctionne sans avoir à importer un quelconque module.
Supposons une liste comme :
people = ["Lisa","Pam","Phil","John"]
Une solution simplifiée en une ligne ressemblerait à ceci.
Toutes les paires possibles y compris les doublons :
result = [foo(p1, p2) for p1 in people for p2 in people]
Toutes les paires possibles, à l'exclusion des doublons :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Paires uniques où l'ordre n'a pas d'importance :
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Dans le cas où vous ne voulez pas opérer mais juste obtenir les paires, supprimez la fonction foo
et l'utilisation d'un simple tuple serait suffisante.
Toutes les paires possibles y compris les doublons :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Résultat :
('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')
Toutes les paires possibles, à l'exclusion des doublons :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Résultat :
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Paires uniques où l'ordre n'a pas d'importance :
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Résultat :
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Edit : Après avoir retravaillé pour simplifier cette solution, j'ai réalisé que c'est la même approche que celle d'Adam Rosenfield. J'espère que l'explication plus large aidera certains à mieux la comprendre.