Seite 1 von 1
Warum haben Listen keine replace()-Methode?
Verfasst: Dienstag 29. April 2008, 16:55
von numerix
Eigentlich ist mit dem Thema schon alles gesagt bzw. gefragt.
Strings haben eine replace()-Methode, Listen nicht.
Warum nicht?
Verfasst: Dienstag 29. April 2008, 17:17
von Leonidas
Gibt es doch. ``liste[index] = neuer_wert``. There should be one-- and preferably only one --obvious way to do it.
Verfasst: Dienstag 29. April 2008, 17:20
von Y0Gi
Gut, es ist nicht ganz dasselbe, aber das sind Strings (immutable) und Listen (mutable) auch nicht.
Ein Ersetzen von bestimmten Einträgen in Listen ist jetzt nicht sooo gängig wie das Ersetzen von Zeichen oder Teilstrings in einem String. Es geht aber relativ einfach, etwa so:
Code: Alles auswählen
for item in some_list:
if item == TO_BE_REPLACED:
yield REPLACEMENT
else:
yield item
Oder als Einzeiler in Form einer Generator Expression:
Code: Alles auswählen
new_list = ((item if (item != TO_BE_REPLACED) else REPLACEMENT) for item in some_list)
Wichtig ist nur, dass es nicht ungefährlich ist, Listen in-place zu verändern, über die man gerade iteriert - da bietet sich ein Generator einfach gut an.
Verfasst: Dienstag 29. April 2008, 17:45
von numerix
Leonidas hat geschrieben:Gibt es doch. ``liste[index] = neuer_wert``. There should be one-- and preferably only one --obvious way to do it.
Das meinte ich (natürlich) nicht - etwas mehr Komfort sollte es schon sein.
Ich meinte ein echtes Äquivalent zur replace()-Methode für Zeichenketten, natürlich ohne die notwendige Einschränkung durch die Unveränderlichkeit.
Also quasi sowas:
Code: Alles auswählen
class Mylist(list):
def replace(self,old,new):
while old in self:
self[self.index(old)] = new
liste = Mylist(["Hund","Katze"]*5)
liste.replace("Katze","Kater")
Mein Problem ist/war ja nicht, dass ich in einer Liste etwas ersetzen wollte und es nicht hinbekommen hätte.
Ich habe mich einfach gefragt, warum es das nicht gibt und mir ist kein Grund eingefallen.
Ja, ja das mit dem "one obvious way". Aber das stimmt an anderen Stellen auch nicht. Da wir bei Listen sind: del(liste[1:4]) oder liste[1:4] = []?
Was ist hier denn der "obvious way"?
Verfasst: Dienstag 29. April 2008, 21:00
von birkenfeld
Der "obvious way" ist, sich den Dreizeiler selber zu schreiben:
Code: Alles auswählen
def lreplace(l, x, y):
for i, e in enumerate(l):
if e == x: l[i] = y
(So hat das Ding auch O(n) Laufzeit...)
Verfasst: Dienstag 29. April 2008, 21:25
von numerix
Ich will ja nicht nerven, aber für mich hat es den Anschein als gäbe es keine wirklich zufriedenstellende Antwort auf meine Ausgangsfrage.
Es fällt doch auf, dass es einige Methoden gibt, die sowohl für Zeichenketten als auch für Listen vorhanden sind. Das ist aufgrund der Ähnlichkeit der Datenstruktur ja auch sinnvoll und nachvollziehbar.
Dass manche Methoden nur für einen der beiden Datentypen erklärt sind, ist ebenfalls einsichtig (z.B. upper() oder lower() für Strings oder insert() für Listen).
Aber bei replace() fehlt mir die Logik und ich hatte mir Erhellung erhofft. Hat aber (noch) nicht geklappt.
Verfasst: Dienstag 29. April 2008, 21:36
von birkenfeld
In den Jahren, in denen ich nun Python programmiere, habe ich nie ein ``list.replace()`` gebraucht. ``str.replace()`` dagegen ständig.
Das ist zwar auch nur ein Datenpunkt, aber sollte etwas über den Grund aussagen. Es gibt hunderte "praktische" Methoden, die man Listen, Tupeln etc. geben könnte, die aber einfach nicht gebräuchlich genug sind -- überladene Interfaces sind schlechte Interfaces.
Verfasst: Mittwoch 30. April 2008, 07:42
von jens
birkenfeld hat geschrieben:In den Jahren, in denen ich nun Python programmiere, habe ich nie ein ``list.replace()`` gebraucht. ``str.replace()`` dagegen ständig.
Dem kann ich mich nur anschließen...
Verfasst: Mittwoch 30. April 2008, 10:39
von Leonidas
birkenfeld hat geschrieben:In den Jahren, in denen ich nun Python programmiere, habe ich nie ein ``list.replace()`` gebraucht. ``str.replace()`` dagegen ständig.
Dem kann ich mich auch anschließen. Ein ``list.replace()`` würde mir auch mehrere Fragen aufwerfen: ersetzt es einzelne Elemente? Ersetzt es inexakte Treffer (also Substrings in Listenelementen)? Ersetzt es verschachtelte Elemente?
Verfasst: Mittwoch 30. April 2008, 11:22
von mitsuhiko
Außerdem gibt str.replace ein neues Objekt zurück, müsste also list.replace auch tun um nicht zu verwirren. Aber wie oft braucht man eine Liste, die nicht in-place verändert wird?
Verfasst: Mittwoch 30. April 2008, 14:05
von numerix
Okay, jetzt habe ich Argumente gehört, die auch für mich schlüssig sind.
Danke an alle!