Eigentlich ist mit dem Thema schon alles gesagt bzw. gefragt.
Strings haben eine replace()-Methode, Listen nicht.
Warum nicht?
Warum haben Listen keine replace()-Methode?
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:
Oder als Einzeiler in Form einer Generator Expression:
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.
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
Code: Alles auswählen
new_list = ((item if (item != TO_BE_REPLACED) else REPLACEMENT) for item in some_list)
Das meinte ich (natürlich) nicht - etwas mehr Komfort sollte es schon sein.Leonidas hat geschrieben:Gibt es doch. ``liste[index] = neuer_wert``. There should be one-- and preferably only one --obvious way to do it.
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")
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"?
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Der "obvious way" ist, sich den Dreizeiler selber zu schreiben:
(So hat das Ding auch O(n) Laufzeit...)
Code: Alles auswählen
def lreplace(l, x, y):
for i, e in enumerate(l):
if e == x: l[i] = y
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.
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.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
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.
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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?birkenfeld hat geschrieben:In den Jahren, in denen ich nun Python programmiere, habe ich nie ein ``list.replace()`` gebraucht. ``str.replace()`` dagegen ständig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
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?
TUFKAB – the user formerly known as blackbird