0
votes

Exclure les valeurs lors de la création de la liste des permutations

Je sais que dans Python, je peux facilement créer une liste contenant toutes les permutations d'une chaîne donnée à l'aide de la fonction permutations () . Imaginez maintenant si je voulais générer uniquement les permutations de la chaîne "3212323" qui ne contiennent pas la chaîne "33" . Comment puis-je atteindre ce résultat?

Exemple:

  • "3231322"
  • "3332122" <- Je ne veux pas que vous
  • "3213223"
  • "3223213"
  • "2223313" <- Je ne veux pas que vous
  • "2322313"
  • "2312332" <- Je ne veux pas que vous
  • ECC ...

    note : Je sais que je pourrais générer toutes les permutations en premier, puis supprimer les spécifiés de la liste, mais ce dont j'ai besoin, c'est de ne pas générer ces permutations du tout, alors jetez-les pendant que Création de la liste des permutations.

    Toute suggestion sera appréciée. Merci d'avance.


1 commentaires

Tout d'abord générer toutes les chaînes avec un seul 3 puis mettre 3 dans des positions qui ne sont pas proches d'un autre 3 .


4 Réponses :



1
votes

Vous pouvez utiliser des générateurs:

original = "3212323"
excluded_substring = '33'
p = (''.join(x) for x in permutations(original))
p = (x for x in p if excluded_substring not in x)

# Or as a one-liner
p = (x for x in (''.join(parts) for parts in permutations(original)) if excluded_substring not in x)


0 commentaires

1
votes

Si vous regardez la documentation de Permutations , Ils vous donnent quelle est la fonction essentiellement. Vous pouvez modifier cela pour exclure '33 ' xxx


0 commentaires

1
votes

Semblable à _mads première option, vous pouvez également utiliser le FilterFalse (prédicat, itérable) fonction de iTerTools:

from itertools import permutations, filterfalse

_str = "3212323"

def predicate(iterable):
    return '33' in ''.join(iterable)

filterfalse(predicate, permutations(_str)))


0 commentaires