2010-06-22 11 views
9

Wie entferne ich ein Zeichen aus einem Element in einer Liste?Bearbeiten von Elementen in einer Liste in Python

Beispiel:

mylist = ['12:01', '12:02'] 

Ich mag den Darm aus dem Zeitstempel in einer Datei entfernen, also kann ich sie zu einer 24 Stunde Zeit leichter konvertieren. Im Moment versuche ich, die Elemente in der Liste zu durchlaufen und suche nach dem, der einen Doppelpunkt enthält, und mache einen Ersatz.

for num in mylist: 
    re.sub(':', '', num) 

Aber das scheint nicht zu funktionieren.

Hilfe!

+3

Es funktioniert nicht, da Zeichenfolgen unveränderlich sind. 're_ eigentlich ** gibt ** eine Zeichenkette zurück, aber Sie ordnen sie nicht zu. Lesen Sie die Dokumentation: http://docs.python.org/library/re.html#re –

Antwort

13

Die Liste Verständnis Lösung ist die Pythonic ein, aber es ist eine wichtige Wendung:

mylist[:] = [s.replace(':', '') for s in mylist] 

Wenn Sie mylist zuweisen, die barename, wie in der anderen Antwort, anstatt zu mylist[:] , das "Ganze-Liste-Slice", wie ich empfehle, du tust wirklich etwas ganz anderes als "Einträge in der Liste zu ersetzen": du machst eine neue Liste und baust nur den Namen an, den du vorher benutzt hast beziehen Sie sich auf die alte Liste.

Wenn auf diese alte Liste mit mehreren Namen (einschließlich Einträge in Containern) verwiesen wird, wirkt sich diese erneute Bindung nicht auf diese aus: Wenn Sie z. B. eine Funktion haben, die mylist als Argument verwendet wirkt sich nur lokal auf die Funktion aus und ändert nichts an dem, was der Aufrufer als Inhalt der Liste sieht.

Zuordnung zu der ganzen Liste in Scheiben schneiden, mylist[:] = ... ändert die Liste Objekt anstatt herumschlagen mit Schalt barenames' Bindungen - jetzt diese Liste wirklich verändert wird, und, egal wie man es genannt hat, wird der neue Wert was ist gesehen. Wenn Sie beispielsweise eine Funktion haben, die mylist als Argument verwendet, ändert die Gesamtliste-Slice-Zuweisung, was der Aufrufer als den Inhalt der Liste sieht.

Der Schlüssel ist, genau zu wissen, welchen Effekt Sie anstreben - am häufigsten werden Sie das Listenobjekt ändern wollen. Wenn Sie also raten müssen, ist normalerweise die Zuweisung von ganzen Listen die beste Schätzung ;-). In Bezug auf die Leistung macht es keinen Unterschied (außer dass die Zuweisung des Barnamens, wenn es sowohl alte als auch neue Listenobjekte beibehält, mehr Speicher für den Zeitraum benötigt, in dem beide Objekte natürlich noch vorhanden sind).

4
for i, num in enumerate(mylist): 
    mylist[i] = num.replace(':','') 
+1

Standardmäßig würde ich für diese Lösung gehen, weil Sie die neuen Zeichenfolgen in demselben Listenobjekt neu verschachteln. Der Listenverständnisansatz löst das Ergebnis vom ursprünglichen Listenzeiger. Wenn die Liste die Eigenschaft eines komplexen Objekts ist und dieses komplexe Objekt die aktualisierte Liste haben soll, müssen Sie die neue Liste einer Eigenschaft zuweisen, die sehr unpythonisch ist. – ddotsenko

15

ein list comprehension Verwenden Sie eine neue Liste zu erstellen:

>>> mylist = ['12:01', '12:02'] 
>>> mylist = [s.replace(':', '') for s in mylist] 
>>> print mylist 
['1201', '1202'] 

Der Grund, dass Ihre Lösung nicht funktioniert, ist, dass re.sub ein neue String zurückgibt - Strings in Python unveränderlich sind, so re.sub kann Ihre vorhandenen Zeichenfolgen nicht ändern.

+0

Listenverständnis zur Rettung! – jathanism

+0

Gibt es einen Vorteil von Listen-Comprehensions zu Standard-For-Schleifen oder nur Lesbarkeit oder Länge des Codes? – TooAngel

+3

@TooAngel: Es ist noch toller;) –

0

Sie müssen die Rückgabe von re zurück in die Liste einfügen. Im Folgenden finden Sie eine neue Liste. Aber du kannst das auch für meine Liste tun.

mylist = ['12:01', '12:02'] 
tolist = [] 
for num in mylist: 
    a = re.sub(':', '', num) 
    tolist.append(a) 

print tolist 
0

Strings in Python sind unveränderlich, dh keine Funktion kann den Inhalt einer vorhandenen Zeichenfolge ändern, sondern nur eine neue Zeichenfolge bereitstellen. Hier ist why.

Eine Diskussion über String-Typen, die geändert werden können, finden Sie unter here. In der Praxis ist es jedoch besser, sich an die Unveränderlichkeit von Saiten anzupassen.

Verwandte Themen