8
votes

Comment générer des permutations d'une liste sans "déplacer" des zéros. en python

Utilisation de l'outil iTertools , j'ai toutes les permutations possibles d'une liste de numéros donnée, mais si la liste est la suivante: xxx

iTerTools ne "sait pas" ne "sait pas" que itérant les zéros est gaspillé du travail, par exemple les itérations suivantes apparaîtront dans les résultats: xxx

ils sont les mêmes mais < Code> itTools prend juste le premier zéro (par exemple) et le déplace à la quatrième place dans la liste et vice-versa.

La question est la suivante: comment puis-je itération de certains numéros sélectionnés et laissé seul d'autres comme zéro? Il peut être avec ou sans iTertools .


3 commentaires

Utilisez quelque chose comme sortie2 = liste (SET (Sortie)) , où Sortie est ce que vous avez obtenu de itTools .


J'ai besoin d'itérer quelques chiffres dans toutes les positions dans la liste, laissant seul le zéro.


et là vous êtes. (ma nouvelle approche, la troisième approche, la réponse)


3 Réponses :


2
votes

Ajoutez chaque résultat à une liste. Maintenant, vous aurez toutes les combinaisons possibles et ensuite procédez comme suit: xxx

définir affaimera la liste des permutations uniques uniquement. Je ne suis pas totalement sûr que c'est le problème que vous essayez de résoudre ou que vous êtes inquiet de la performance. Peu importe simplement faire un compte, je pensais que j'essaierais de contribuer quelque chose


5 commentaires

Le seul problème que je vois avec votre approche est qu'il est inefficace de calcul. Il doit y avoir une meilleure façon.


Oui, le problème que j'essaie de résoudre concerne la performance et la vitesse. En utilisant de grandes listes de chiffres, par exemple de 30 ou plus, le programme fonctionne trop de temps et beaucoup de travail est gaspillé, ergo non efficace.


SET et Liste ne sont même pas intégrés à Python. Peut-être que vous vouliez dire list et définir


Sans parler de cela, je jette non seulement tous les zéros (et leur position) longtemps avec toutes les autres répétitions


Ouais corrigé ces problèmes de capitalisation.



0
votes

Vos questions ne sont pas claires, mais si vous essayez de répertorier les permutations sans avoir 0 code> dans votre sortie, vous pouvez le faire comme suit:

from itertools import permutations
def perms( listy ):
    return permutations( [i for i in listy if i!=0])


2 commentaires

Je ne pense pas que c'est ce qu'il veut, mais cela peut être la base de cela. Vous pouvez maintenant imprégner vos permutations avec 0S pour générer encore plus de combinaisons dont chacune a la longueur de la liste d'origine ☺


J'ai besoin de la 0 dans la sortie mais je n'ai pas besoin de cela pour faire partie de la permutation. Ceci pour éviter la sortie en double et la perte de travail de la CPU. Peut-être que je peux créer une liste de base de zéros, puis insérer les numéros permutés dedans?



3
votes

Voilá - Cela fonctionne maintenant - après avoir obtenu les permutations sur la "viande", je reçois en outre toutes les combinaisons possibles pour les positions "0" et le rendement une permutation pour chaque ensemble possible de "0 positions" pour chaque permutation des non-0s: xxx

(J'ai utilisé le mot-clé 3 "non local" de Python - si vous êtes toujours sur Python 2.7, Vous devrez adopter une autre approche, comme la fabrication SEQ_LEN Be une liste avec un seul élément que vous pouvez ensuite repplacer sur la fonction interne)

mon deuxième essai (le fonctionnement est en fait le 3ème)

Il s'agit d'une approche naïve qui permet de conserver une cache des permutations déjà «observées» - cela permet d'économiser sur le travail effectué à chaque permutation, mais NotonLe travail pour générer tout Permutations possibles: xxx


5 commentaires

Vous devez maintenant jeter un coup d'œil aux partitions de N où n est le nombre de zéros dans la liste d'origine. Le nombre d'éléments non nuls (k) est également important car ils définissent les types de partition admissibles. Par exemple, si k = 3 comme dans l'exemple ci-dessus, chaque partition peut être exprimée comme une somme de valeurs K + 1 mais pas plus.


@ V.Pétretto mais vous ne voulez pas qu'ils répètent, n'est-ce pas ??


Non, je ne veux pas qu'ils répètent, laissez-moi écrire un exemple de sortie: [0,1,1,0,8] [0,1,0,8,0] [1,0,8,0,0 ] [1,8,0,0,0,0] [8,0,1,0,0] et ainsi de suite


(laissant ceci juste pour remarquer que les commentaires ci-dessus concernaient une version antérieure de cette réponse. L'algorithme actuel permute les 0)


Merci beaucoup ! :)