J'écris un programme qui prend un permutations de «modèle» de chaînes, et affiche toutes les permutations en fonction de ce modèle. Le modèle ressemble à ceci:Permutations imbriquées à partir du modèle
model = Mix([
[
"this",
PickOne(["is", "isn't"])
],
PickOne([
Mix([
"absolutely",
"great"
])
])
])
Dans les permutations en sortie,
list
objets affichera les objets contenant dans l'ordreMix
objets affichera les dans tous les ordres possibles objets contenant avec toujours longueur maximale possible (y compris zéro)PickOne
objets ne produiront qu'un seul de ses objets à la fois
Ainsi, la sortie désirée de l'exemple ci-dessus serait:
[
["this", "is"],
["this", "isn't"],
["this", "is", "absolutely"],
["this", "is", "great"],
["this", "isn't", "absolutely"],
["this", "isn't", "great"],
["absolutely"],
["great"],
["absolutely", "this", "is"],
["great", "this", "is"],
["absolutely", "this", "isn't"],
["great", "this", "isn't"],
[]
]
Jusqu'à présent, je l'ai mis en œuvre les permutations pour la classe Mix
comme ceci:
class Mix(list):
def __init__(self, *args, **kwargs):
super(Mix, self).__init__(*args, **kwargs)
self.permutations = []
for L in range(0, len(self)+1):
for subset in itertools.combinations(self, L):
subset_permutations = itertools.permutations(subset)
self.permutations.extend(subset_permutations)
et mon PickOne
classe est simplement cela
class PickOne(list):
pass
que je suis le plan en testant simplement dans ma fonction principale et en la manipulant en conséquence (if type(obj) is PickOne: ...
).
itertools
itertools
offre simplification et efficacité pour des cas d'utilisation plus simples, mais je ne sais pas comment cela va m'aider pour cette implémentation (au-delà de ce que j'ai déjà implémenté dans Mix
). Des idées de la façon dont itertools
peut être utilisé pour aider à une mise en œuvre Pythonic de ce qui précède?
Je vais avoir du mal à envelopper ma tête autour this.So même une plaine « liste », si elle contient d'autres « modèles de permutation », devrait donner le produit de tous les possibles les résultats de ces modèles s, non? –
C'est exact. – Julien