J'essaie de générer toutes les permutations à partir d'une liste de chaînes où certaines sous-chaînes de caractères sont supprimées. Je dispose d'une liste de certaines compositions chimiques et je souhaite obtenir toutes les compositions résultant de cette liste lorsque l'un de ces éléments est supprimé. Un court extrait de cette liste ressemble à ceci :
AlCrHfMoNbN
AlCrHfMoTaN
AlCrHfMoTiN
AlCrHfMoVN
AlCrHfMoWN
...
Ce que j'essaie d'obtenir, c'est
AlCrHfMoNbN --> CrHfMoNbN
AlHfMoNbN
AlCrMoNbN
AlCrHfNbN
AlCrHfMoN
AlCrHfMoTaN --> CrHfMoTaN
AlHfMoTaN
AlCrMoTaN
AlCrHfTaN
AlCrHfMoN
pour chaque composition. Je n'ai besoin que de la bonne colonne. Comme vous pouvez le constater, certaines des compositions obtenues sont des doublons, ce qui est voulu. La liste des éléments à supprimer est la suivante
Al, Cr, Hf, Mo, Nb, Ta, Ti, V, W, Zr
Comme vous le voyez, certains ont une longueur de deux caractères et d'autres d'un seul.
Il existe une question qui porte sur un sujet très similaire, mais mon problème est plus complexe : Obtention d'une liste de chaînes de caractères dont le caractère a été supprimé par permutation
J'ai essayé d'adapter le code à mes besoins :
def f(s, c, start):
i = s.find(c, start)
return [s] if i < 0 else f(s, c, i+1) + f(s[:i]+s[i+1:], c, i)
s = 'AlCrHfMoNbN'
print(f(s, 'Al', 0))
Mais cette approche simple n'aboutit qu'à ['AlCrHfMoNbN', 'lCrHfMoNbN']
. Ainsi, un seul caractère est supprimé, alors que j'ai besoin de supprimer une chaîne définie de caractères de longueur variable. De plus, je suis limité à un seul objet d'entrée s
- au lieu de centaines que je dois traiter - il n'est donc pas possible de les passer en revue à la main.
En résumé, ce dont j'ai besoin, c'est d'une modification du code qui permette de.. :
- entrée d'une liste de chaînes de caractères séparées par des sauts de ligne ou des espaces blancs
- supprimer les sous-chaînes de caractères de cette liste qui sont définies par une deuxième liste (comme ci-dessus)
- écrit les éléments "réduits" qui en résultent dans une liste continue, de préférence dans une seule colonne sans virgule et autres.
Comme je n'ai qu'une certaine expérience de Python et de Bash, je préfère de loin une solution utilisant ces langages.