Comment scinder une liste de paires de toutes les façons possibles
J'ai une liste (disons 6 éléments pour des raisons de simplicité)
L = [0, 1, 2, 3, 4, 5]
et je veux le morceau en paires dans TOUS les façons possibles. Je montre quelques configurations:
[(0, 1), (2, 3), (4, 5)]
[(0, 1), (2, 4), (3, 5)]
[(0, 1), (2, 5), (3, 4)]
et ainsi de suite.
Ici (a, b) = (b, a)
et de l'ordre de paires n'est pas important, c'est à dire
[(0, 1), (2, 3), (4, 5)] = [(0, 1), (4, 5), (2, 3)]
Le nombre total de ces configurations est 1*3*5*...*(N-1)
où N
est la longueur de ma liste.
Comment puis-je écrire un générateur en Python qui me donne toutes les configurations possibles pour un arbitraire N
?
- Vous voudrez peut-être vérifier que le module standard
itertools
si vous ne l'avez pas déjà. Les fonctions il devrait être en mesure d'aider avec ce problème (peut-être lapermutations
,combinations
ouproduct
fonctions). - Si l'ordre n'est pas important, vous devriez probablement utiliser des ensembles ou des frozensets.
- Dans la langue de la combinatoire, vous voulez générer tous les couplages parfaits d'un ensemble donné (dans un graphe complet).
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à
itertools.combinaisons
.Je ne pense pas qu'une fonction de la bibliothèque standard, qui fait exactement ce dont vous avez besoin. Juste à l'aide de
itertools.combinations
vous pouvez obtenir une liste de toutes les paires individuelles, mais n'a pas de résoudre le problème de toutes les combinaisons de paires.Vous pourriez résoudre facilement avec:
Mais cela ne vous obtenir des doublons que l'on traite (a,b) et (b,a) comme différents, et donne également tous les achats de paires. En fin de compte, j'ai pensé qu'il est plus facile de ce code à partir de zéro que d'essayer de filtrer les résultats, voici donc la fonction correcte.
Il est récursif, donc il fonctionnera dans la pile des problèmes avec une longue liste, mais sinon, est-ce que vous nécessité.
[(0, 1), (2, 3), 4]
.Comment à ce sujet:
ou
Conceptuellement similaire à @shang réponse, mais il ne suppose pas que les groupes sont de taille 2:
Cela donne:
Mon patron ne va probablement pas à être heureux, j'ai passé un peu de temps sur ce problème amusant, mais voici une belle solution qui n'a pas besoin de la récursivité, et utilise
itertools.product
. C'est expliqué dans la docstring :). Les résultats semblent OK, mais je ne l'ai pas testé trop.cheers!
all_pairings
etxrange
devrait être remplacé parrange
en Python 3.Essayez ce qui suit récursif de la fonction de générateur:
Exemple d'utilisation:
Utilisation:
Un non-récursive de la fonction pour trouver toutes les paires d'où l'ordre n'a pas d'importance, c'est à dire, (a,b) = (b,a)
Car il est non-récursive vous ne rencontrez pas de problèmes de mémoire avec de longues listes.
Exemple d'utilisation:
J'ai fait un petit test de suite pour toutes les solutions conformes. J'ai dû changer de fonctions un peu pour les faire travailler en Python 3. Fait intéressant, la manière la plus rapide de la fonction de PyPy est le plus lent de la fonction en Python 2/3 dans certains cas.
Ils semblent tous pour générer le même ordre, de sorte que les ensembles ne sont pas nécessaires, mais de cette façon c'est l'avenir. J'ai expérimenté un peu avec le Python 3 de la conversion, il n'est pas toujours clair de savoir où construire la liste, mais j'ai essayé quelques solutions de rechange et a choisi la manière la plus rapide.
Voici les résultats de la référence:
Donc, je dis, allez-y avec gatoatigrado de la solution.
Espère que cette aide
Ce code fonctionne lorsque la longueur de la liste n'est pas un multiple de 2, elle emploie un hack pour le faire fonctionner. Peut-être il ya de meilleures façons de le faire...Il s'assure également que les paires sont toujours dans un n-uplet et qu'il fonctionne si l'entrée est une liste ou un tuple.
Espère que cela aidera à:
de sortie:
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]