Je ne pense pas qu'il existe une fonction dans la bibliothèque standard qui fasse exactement ce dont vous avez besoin. Il suffit d'utiliser itertools.combinations
permet d'obtenir une liste de toutes les paires individuelles possibles, mais ne résout pas le problème de toutes les combinaisons de paires valides.
Vous pouvez facilement résoudre ce problème avec :
import itertools
def all_pairs(lst):
for p in itertools.permutations(lst):
i = iter(p)
yield zip(i,i)
Mais vous obtiendrez des doublons, car il traite (a,b) et (b,a) comme différents, et donne également tous les ordres de paires. Finalement, je me suis dit qu'il était plus facile de coder cela à partir de zéro que d'essayer de filtrer les résultats, donc voici la fonction correcte.
def all_pairs(lst):
if len(lst) < 2:
yield []
return
if len(lst) % 2 == 1:
# Handle odd length list
for i in range(len(lst)):
for result in all_pairs(lst[:i] + lst[i+1:]):
yield result
else:
a = lst[0]
for i in range(1,len(lst)):
pair = (a,lst[i])
for rest in all_pairs(lst[1:i]+lst[i+1:]):
yield [pair] + rest
Il est récursif, ce qui pose des problèmes de pile avec une longue liste, mais il fait autrement ce dont vous avez besoin.
\>>> for x in all\_pairs(\[0,1,2,3,4,5\]):
print x
\[(0, 1), (2, 3), (4, 5)\]
\[(0, 1), (2, 4), (3, 5)\]
\[(0, 1), (2, 5), (3, 4)\]
\[(0, 2), (1, 3), (4, 5)\]
\[(0, 2), (1, 4), (3, 5)\]
\[(0, 2), (1, 5), (3, 4)\]
\[(0, 3), (1, 2), (4, 5)\]
\[(0, 3), (1, 4), (2, 5)\]
\[(0, 3), (1, 5), (2, 4)\]
\[(0, 4), (1, 2), (3, 5)\]
\[(0, 4), (1, 3), (2, 5)\]
\[(0, 4), (1, 5), (2, 3)\]
\[(0, 5), (1, 2), (3, 4)\]
\[(0, 5), (1, 3), (2, 4)\]
\[(0, 5), (1, 4), (2, 3)\]