2013-05-13 3 views
-4

Je dois créer beaucoup plus de fichiers dans un répertoire, donc je veux que cela soit fait en mode grammatical. Je choisi python, mais comment résoudre le problème suivantComment modifier l'entrée de la liste dans python 2.x, en utilisant la boucle

J'ai une liste

L = [ 'a', 'b', 'c']

Maintenant, je veux modifier l'entrée dans la liste l comme ci-dessous

l = [ 'a.txt', 'b.txt', 'c.txt']

Comment faire?

+6

S'il vous plaît ne pas modifier vos questions à faire les réponses existantes sont invalides, et au lieu de demander aux gens d'écrire du code pour vous, au moins montrer ce que vous avez essayé jusqu'à présent (bien que pour être juste, les 4 personnes qui ont écrit le code pour vous ne montre aucun effort du tout ...) – geoffspear

Répondre

2

Pour modifier une liste, itérer à l'aide d'indices:

for i in range(len(L))): 
    L[i] += '.txt' 

Cependant, dans ce cas, vous ne vraiment pas besoin de modifier la liste, de sorte que vous voulez probablement utiliser la liste comrehension, comme l'a suggéré par @Ashwini Chaudhary. Cependant, en utilisant la compréhension de la liste crée nouvelle liste, donc vous pouvez l'assigner à nouveau en L:

L = [s + '.txt' for s in L] 

Mais, si la variable L d'origine est une variable globale ou non locale, la déclaration ci-dessus créera de nouvelles, variable locale , qui disparaîtra à la fin de la fonction en cours, et peut créer un désordre si vous avez essayé d'y accéder avant la asssignment:

>>> L = ['a', 'b', 'c'] 
>>> def addtxt(): 
...  print(L) 
...  L = [s + '.txt' for s in L] 
... 
>>> addtxt() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in addtxt 
UnboundLocalError: local variable 'L' referenced before assignment 

vous devez ajouter global (ou nonlocal dans d'autres cas) déclaration. Ce n'est pas une façon propre de gérer cela.

Ainsi, la combinaison de remplacement en place avec la compréhension de la liste, vous obtenez la suggestion de @Jamylak

L[:] = [s + '.txt' for s in L] 

[:] signifie que le contenu de la liste sera remplacé par le côté droit de l'affectation. Cela n'ajoutera pas de liaison locale, et s'adaptera à n'importe où la boucle mentionnée ci-dessus s'adaptera.

3
>>> L=['a','b','c'] 
>>> L[:] = [x + '.txt' for x in L] 
>>> L 
['a.txt', 'b.txt', 'c.txt'] 

L'affectation de tranche [:] est utilisée pour muter L lui-même et de conserver des références. par exemple. C'est ce qui se passe si vous ne l'utilisez pas

>>> L=['a','b','c'] 
>>> L2 = L # you may have a reference like this in your code somewhere 
>>> L = [x + '.txt' for x in L] # this simply reassigns the name L to a new value 
>>> L 
['a.txt', 'b.txt', 'c.txt'] 
>>> L2 # but doesn't affect the name L2 which is still binded to the old list 
['a', 'b', 'c'] 
+0

+1 pour 'L [:]', son nettoyeur. –

2

Un peu plus simple que la réponse précédente:

L = [i + '.txt' for i in L] 

ou

for i, string in enumerate(L): 
    L[i] = string + '.txt' 
+0

La première option n'est pas sémantiquement équivalente à la seconde.Le second a l'inconvénient d'aliaser 'L [i]' avec 'string', ce qui le rend un peu confus. Je pense que "+ =" est meilleur. – Elazar

Questions connexes