Prenez votre liste, dites [1,2]
, et considérez les espaces entre les éléments. Comme il y a deux éléments dans notre exemple, il y a trois espaces. Appelons-les 0, 1, 2
. Vous voulez placer votre lettre 'A'
dans ces espaces. Bien que vous ne le disiez pas, il semble, d'après votre exemple, qu'une lettre au plus doit aller dans chaque espace, donc il n'y a pas de répétition.
Par conséquent, vous souhaitez obtenir tous les sous-ensembles possibles de l'ensemble {0, 1, 2}
. Pour chacun de ces ensembles, placez une lettre 'A'
à cet espace dans cet ensemble.
L'ensemble de tous les sous-ensembles est appelé "ensemble d'alimentation". Python n'a pas tout à fait cela intégré, mais il y a plusieurs façons de l'obtenir. Voici une façon qui utilise le module intégré itertools
.
import itertools
def powerset(iterable):
"powerset([1,2,3]) -->() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return itertools.chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
utiliser pour obtenir vos ensembles d'espaces, puis utilisez chaque jeu pour insérer vos 'A'
s dans la liste.
Si vous voulez vraiment des lignes vides dans votre sortie entre les groupes de listes, vous pouvez préférer utiliser la fonction itertools.combinations(s, r)
directement - cela donne tous les sous-ensembles de jeu s
de taille r
. En boucle sur r
et imprimez les listes résultantes et imprimez une ligne vide après chaque valeur de r
. Compte tenu de la sortie particulière que vous voulez, c'est probablement la meilleure option.
Une autre façon d'obtenir le jeu de paramètres utilise la méthode powerset()
de la classe FiniteSet
de sympy
. Le module sympy
n'est pas une partie standard de Python, mais si vous avez installé Python en utilisant l'installation d'Anaconda, vous l'avez déjà. Encore une autre façon d'obtenir le powerset consiste à créer sa propre routine récursive ou de back-tracking. C'est la manière la plus difficile mais cela évite d'utiliser des modules.
Voici le code implémentant la "meilleure option", en utilisant itertools.combinations
directement. J'ai changé vos variables pour avoir de meilleurs noms et contenus.
from itertools import combinations
mylistsize = 2
myinsertitem = 'A'
mylist = list(range(1, mylistsize+1))
allspaceplaces = list(range(mylistsize+1))
for numinserts in range (mylistsize + 2):
if numinserts:
print()
for spaceplaces in combinations(allspaceplaces, numinserts):
newlist = []
lo = 0
for hi in spaceplaces:
newlist.extend(mylist[lo:hi])
newlist.append(myinsertitem)
lo = hi
newlist.extend(mylist[lo:])
print(newlist)
L'impression de ce code est
[1, 2]
['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']
['A', 1, 'A', 2]
['A', 1, 2, 'A']
[1, 'A', 2, 'A']
['A', 1, 'A', 2, 'A']
merci pour ce conseil. J'ai édité la question. – ddas