Des combinaisons sans l'aide de “itertools.les combinaisons”
Ce que j'avais besoin de faire est de créer des combinaisons de deux éléments à la fois.
si une liste contient: seq = ['A', 'B', 'C']
la sortie serait com = [['A', 'B'], ['A', 'C'], ['B', 'C']]
tout cela sans "itertools.les combinaisons" la méthode.
J'avais l'habitude d'utiliser ce code pour les permutations. Mais comment pourrais-je modifier le code pour le faire fonctionner avec les combinaisons?
def permute(seq):
if len(seq) <= 1:
perms = [seq]
else:
perms = []
for i in range(len(seq)):
sub = permute(seq[:i]+seq[i+1:])
for p in sub:
perms.append(seq[i:i+1]+p)
return perms
Pourquoi sans
L'équivalent de code source pour
Oui, je ne peux pas utiliser d'autres méthodes. Merci, je vais jeter un oeil.
itertools
?L'équivalent de code source pour
combinations
est sur le itertools
page de documentation. Il suffit de copier-coller dans votre fichier.Oui, je ne peux pas utiliser d'autres méthodes. Merci, je vais jeter un oeil.
OriginalL'auteur user3104548 | 2013-12-24
Vous devez vous connecter pour publier un commentaire.
Si vous ne souhaitez pas utiliser
itertools
, puis utilisez le documenté pur Python équivalent:O(r * (n! / (r! (n - r)!)))
: lewhile
bouclesnCr
fois, ettuple(pool[i] for i in indices)
fait de chaque boucle ontO(r)
travail. Donc, cette solution itérative est beaucoup plus efficace que le retour en arrière récursif solution, je pense que c'estO(n^r)
.Je n'ai pas fait une analyse de la complexité; d'un coup d'oeil, je pense que vous avez obtenu la complexité correcte. Il est certainement bien au-dessous de O(nr).
OriginalL'auteur Martijn Pieters
C'est trivial à faire directement:
Alors:
affiche:
La seule chose qui rend les combinaisons à tous difficile de traiteur pour un seul-à-runtime nombre d'éléments à prendre à un moment. Tant que vous savez que nombre à l'avance, un nombre fixe de boucles imbriquées qu'au plus profond de fait le travail de façon évidente.
OriginalL'auteur Tim Peters
D'entrée:
De sortie:
OriginalL'auteur SixenseMan
Voici une traduction approximative de l'récursive de code C++ dans un réponse à une question similaire:
De sortie:
OriginalL'auteur martineau