Letztes Vorkommen eines Elements in einer Liste entfernen

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
Olivia
User
Beiträge: 4
Registriert: Sonntag 28. August 2016, 09:01

Hallo,

wie kann ich das letzte Vorkommen eines Elements in einer Liste entfernen? Ich suche für mein Programm so etwas wie "a.remove(b)", allerdings sollte es nicht das erste Vorkommen von "a" entfernen, sondern das letzte. Ich bisher noch nichts im Internet gefunden und mir fällt auch selber keine Lösung ein. :|

Vielen Dank für eure Antworten :)

Olivia
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Olivia: wenn Du ein Problem nicht lösen kannst, dann mußt Du es in mehrere Teilprobleme aufteilen. Mal als Ansatz: suche den Index des letzten Elements und lösche anschließend das Element mit diesem Index.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wobei des Löschen von Elementen einer Liste generell nicht empfehlenswert ist. Die Liste muss dann möglicherweise intern neu strukturiert werden und dies wirkt sich negativ auf die Laufzeit aus. Das Löschen des letzten Elements ist ein Sonderfall, der meistens dann vorkommt, wenn man eine Liste als Stack nutzt. Die übliche Operation zum Abwerfen des letzten (d.h. am weitesten oben liegenden) Elements lautet dann `stack.pop()`. Hat letztlich den gleichen Effekt wie ``del stack[-1]``, ist aber IMHO eleganter.
BlackJack

@snafu: Naja, es hat nicht ganz den gleichen Effekt: `pop()` gibt das Element zurück (kann auch mit einem Index aufgerufen werden!) und ``del`` entfernt es nur.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Wenn es nicht so sehr auf die Laufzeit - und ggf. den Speicher - ankommt, dann kann man auch ganz primitiv vorgehen: Liste umdrehen, aus der umgedrehten Liste das erste passende Element entfernen und die Liste wieder zurückdrehen.
BlackJack

@/me: Ich denke von der Laufzeit könnte das wahrscheinlich sogar schneller sein, ausser die Liste ist sehr gross. Also zumindest in CPython. Wieso Speicher? Umdrehen der Liste sollte ohne zusätzlichen Speicher auskommen, das kann man ja ”in place” machen.

Hier trotzdem mal ein Ansatz ohne die Liste umzudrehen (`reversed()` dreht die Liste nicht um sondern liefert einen Iterator der die Liste von hinten durchgeht) (ungetestet):

Code: Alles auswählen

def remove_last(sequence, what):
    for i, item in enumerate(reversed(sequence), 1):
        if item == what:
            del sequence[-i]
            break
Olivia
User
Beiträge: 4
Registriert: Sonntag 28. August 2016, 09:01

Vielen Dank für die verschiedenen Lösungsansätze! :)

Gerade der letzte scheint vielversprechend zu sein, ich muss aber wahrscheinlich noch etwas rumprobieren bis ich ihn einsetzen kann, vorallem weil ich noch ein ziemlicher Anfänger bin und noch nicht den gesamten Code verstehe. Aber trotzdem danke :D

Olivia
Antworten