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
Letztes Vorkommen eines Elements in einer Liste entfernen
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.
@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.
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.
@/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):
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
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
Olivia
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
Olivia