Ich muss eine Liste durchsuchen und alle Vorkommen eines Elements durch ein anderes ersetzen. Bisher bringen mich meine Codeversuche nicht weiter. Was ist der beste Weg, dies zu tun?
Angenommen, meine Liste enthält die folgenden Ganzzahlen
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
und ich muss alle Vorkommen der Zahl 1 durch den Wert 10 ersetzen, damit die Ausgabe, die ich brauche, ist
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Mein Ziel ist es daher, alle Instanzen der Nummer 1 durch die Nummer 10 zu ersetzen.
Antworten:
quelle
Versuchen Sie es mit einem Listenverständnis und dem ternären Operator .
quelle
a
oder? Ich denke, OP wolltea
sich änderna
mutiert werden soll, aber (wie Alekhya zeigt) ist es trivial, beide Fälle zu behandeln, wenn ein Listenverständnis verwendet wird.a
sollten Sie dies tuna[:] = [4 if x==1 else x for x in a]
(beachten Sie das vollständige Listen-Slice). Wenn Sie dies tun,a =
wird eine neue Listea
mit einer anderenid()
(Identität) als der ursprünglichen erstelltDas Listenverständnis funktioniert gut, und das Durchlaufen mit enumerate kann Ihnen Speicherplatz sparen (b / c wird die Operation im Wesentlichen an Ort und Stelle ausgeführt).
Es gibt auch funktionale Programmierung. Siehe Verwendung der Karte :
quelle
lambda
undmap
gelten als unpythonisch.Wenn Sie mehrere Werte ersetzen müssen, können Sie auch ein Wörterbuch verwenden:
quelle
n
es nicht gefunden wirddic
?n
nicht gefunden wird. Ich hoffe es macht dir nichts aus. Ihretry/except
Lösung war nicht gut.try-except
ist mindestens 50% schneller!if n in dic.keys()
ist schlecht in Bezug auf die Leistung. Verwenden Sieif n in dic
oderdic.get(n,n)
(Standardwert)quelle
Sie können eine for- und / oder while-Schleife verwenden. Wenn Sie jedoch die integrierte Aufzählungsfunktion kennen, wird empfohlen, Aufzählung zu verwenden. 1
quelle
So ersetzen Sie einfach alle
1
mit10
ina = [1,2,3,4,5,1,2,3,4,5,1]
einer der folgenden einzeiligen Lambda + Karte Kombination verwenden könnte, und ‚Schauen Sie , Ma, keine IFs oder Fors!‘ ::# This substitutes all '1' with '10' in list 'a' and places result in list 'c':
c = list(map(lambda b: b.replace("1","10"), a))
quelle
lambda
auf jedem Listenelement ein ...Das Folgende ist eine sehr direkte Methode in Python 2.x.
Diese Methode funktioniert. Kommentare sind willkommen. Ich hoffe es hilft :)
Versuchen Sie auch zu verstehen, wie die Lösungen von outis und damzam funktionieren. Listenkomprimierungen und Lambda-Funktionen sind nützliche Werkzeuge.
quelle
Ich weiß, dass dies eine sehr alte Frage ist und es gibt unzählige Möglichkeiten, dies zu tun. Das einfachere, das ich gefunden habe, ist die Verwendung eines
numpy
Pakets.quelle
Mein Anwendungsfall wurde ersetzt
None
einen Standardwert ersetzt.Ich habe zeitgesteuerte Ansätze für dieses Problem, die hier vorgestellt wurden, einschließlich der von @kxr - using
str.count
.Testcode in ipython mit Python 3.8.1:
Ich bekomme:
Die Verwendung des internen
str.index
ist in der Tat schneller als jeder manuelle Vergleich.Ich wusste nicht, ob die Ausnahme in Test 4 mühsamer sein würde als die Verwendung
str.count
, der Unterschied scheint vernachlässigbar.Beachten Sie, dass
map()
(Test 6) einen Iterator und keine tatsächliche Liste zurückgibt, also Test 7.quelle
Bei langen Listen und seltenen Vorkommen ist die Verwendung etwa dreimal schneller
list.index()
- im Vergleich zu Einzelschritt-Iterationsmethoden, die in den anderen Antworten vorgestellt werden.quelle
Sie können das Listenverständnis einfach in Python verwenden:
In Ihrem Fall, in dem Sie alle Vorkommen von 1 durch 10 ersetzen möchten, sieht das Code-Snippet folgendermaßen aus:
quelle
Suchen und ersetzen Sie nur einen Artikel
quelle