2017-09-16 1 views
0

J'ai une liste mylist=[1,2] et je veux insérer le maximum len(mylist)+1 le numéro d'un élément 'A' entre les éléments de la liste de toutes les manières possibles . La sortie devrait être quelque chose comme ceux-ci,Insérer un nombre de même élément nouveau entre les éléments d'une liste de toutes les manières possibles en Python

[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'] 

Jusqu'à présent, je suis en mesure d'insérer un seul « A » dans la liste de toutes les manières possibles. Voici mon code,

m = 3  
mylist = list(range(1,m))  
for j in range (len(mylist)+1): 
    newlist = mylist[:j] + ['A'] + mylist[j:] 
    print(newlist) 

et la sortie est,

['A', 1, 2] 
[1, 'A', 2] 
[1, 2, 'A'] 

Je suis coincé dans les prochaines étapes, quand je dois insérer deux « A » entre les éléments de la liste. Besoin d'aide pour.

+0

merci pour ce conseil. J'ai édité la question. – ddas

Répondre

2

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'] 
+0

vous avez bien expliqué et oui, je n'ai pas besoin de ces lignes vides. Moi aussi j'essayais avec 'itertools' mais je n'arrivais pas à atteindre le but.Merci de votre aide :) – ddas