2017-05-18 1 views
-1

Wie kann ich alle Elemente in einer Liste ändern, ohne eine andere Liste zu verwenden?Wie kann ich alle Elemente in einer Liste ändern, ohne eine andere Liste zu verwenden?

my_list = ["a","b","c","d"] 

Ich möchte hinzufügen "!" zu allen Elementen zu machen my_list gleich ["a!","b!","c!","d!"].

Ich weiß, dass ich dies durch Erstellen einer neuen Liste tun kann, aber ich muss es ohne eine zweite (neue) Liste tun.

+0

'list' in Python ein veränderliches Sequenz ist. – stamaimer

Antwort

6

Die Liste ist wandelbar, so dass dies funktionieren wird:

my_list = ["a","b","c","d"] 
for index, item in enumerate(my_list): 
    my_list[index] = '{}!'.format(item) 

Typischerer eine Liste Verständnis verwendet werden würde:

my_list = ('{}!'.format(item) for item in my_list) 

Dieses eine neue Liste erstellt und erneut bindet es an my_list. Um Ihre „ohne eine weitere Liste mit“ Anforderung, können Sie die Liste an Ort und Stelle aktualisieren mit:

my_list[:] = ('{}!'.format(item) for item in my_list) 

, die keine neue oder Zwischen Liste nicht erstellen, so dass es Ihnen das Beste aus beiden gibt, dh lesbar Pythonic Code und Effizienz von Speicher und Zeit (der Generatorausdruck ist im Allgemeinen schneller als eine for-Schleife).

+1

Ich denke, was ist mit diesen einfachen Fragen ziemlich nett ist, dass Sie viele verschiedene Antworten gleichzeitig bekommen und Leute wählen leicht unterschiedliche Ansätze. Vergleichen Sie 'for index, item in enumerate (meine_liste)' vs 'für index in range (len (meine_liste))'. Auch, '{}! '. Format (...)' vs '... +'! ''. – Andrei

3

Wenn Sie besorgt sind, nicht eine neue Liste erstellen, können Sie eine for Schleife

my_list = ["a","b","c","d"] 

>>> id(my_list) 
4077896 

for i in range(len(my_list)): 
    my_list[i] += '!'  

>>> my_list 
['a!', 'b!', 'c!', 'd!'] 
>>> id(my_list) 
4077896 

Ansonsten nutzen die einzeilige Lösung eine neue Liste zu machen wäre, und weisen sie zurück, aber beachten Sie, dass die id wird sich ändern, weil es sich tatsächlich um eine neue Liste handelt.

>>> my_list = [i+'!' for i in my_list] 
>>> my_list 
['a!', 'b!', 'c!', 'd!'] 
0

Sie können Python-Liste Verständnis verwenden:

my_list = ["a","b","c","d"] 
my_list = [x+"!" for x in my_list] 
+0

Es heißt Listenverständnis. Die Antwort ist ansonsten gut. – cezar

+0

@cezar erstellt eine neue Liste tho – Igonato

+0

@Igonato, ja, der Variablenname ändert sich nicht, aber es hat einen anderen Zeiger. Mit Slicing vermeiden Sie das: 'my_list [:] = [x +"! " für x in meiner_liste] '. – cezar

1

Sie Index Zugriff auf die Liste verwenden können, um die Werte zu ändern:

my_list = ["a","b","c","d"] 
for ix in range(len(my_list)): 
    my_list[ix] = my_list[ix] + '!' 
1

Versuchen Sie, diese -

my_list = ['a', 'b', 'c', 'd'] 
for i, e in enumerate(my_list): 
    my_list[i] += "!" 

print my_list 

Wenn Sie die Liste der nicht neuen Listen ignorieren möchten Das Verständnis der Liste wäre eine gute Idee. So -

my_list = [e + "!" for e in my_list] 
1

Meinen Sie so etwas wie:

for i in range(len(my_list)): 
    my_list[i] += "!" 

Aber warum bestehen auf keine andere Liste mit? Ein besserer Ansatz wäre:

my_list = [e + "!" for e in my_list] 

Aus purer Neugier:

import time 

def opt1(): 
    my_list = ["a","b","c","d"] 
    for i in range(len(my_list)): 
     my_list[i] += "!" 

def opt2(): 
    my_list = ["a","b","c","d"] 
    my_list = [e + "!" for e in my_list] 

def test(func, count): 
    begin = time.time() 
    for i in range(count): 
     func() 
    return time.time() - begin 

print("Option 1: {}".format(test(opt1, 1000000))) 
print("Option 2: {}".format(test(opt2, 1000000))) 

gibt

Option 1: 0.952999830246 
Option 2: 0.640000104904 
Verwandte Themen