Warum haben Listen keine replace()-Methode?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Eigentlich ist mit dem Thema schon alles gesagt bzw. gefragt.
Strings haben eine replace()-Methode, Listen nicht.
Warum nicht?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Gibt es doch. ``liste[index] = neuer_wert``. There should be one-- and preferably only one --obvious way to do it.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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"?
Benutzeravatar
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:

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...)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Okay, jetzt habe ich Argumente gehört, die auch für mich schlüssig sind.
Danke an alle!
Antworten