1212 Stimmen

Gibt es eine einfache Möglichkeit, ein Listenelement nach Wert zu löschen?

Ich möchte einen Wert aus einer Liste entfernen, wenn er in der Liste vorhanden ist (was er möglicherweise nicht ist).

a = [1, 2, 3, 4]
b = a.index(6)

del a[b]
print(a)

Das obige Beispiel führt zu dem Fehler:

ValueError: list.index(x): x not in list

Ich muss also Folgendes tun:

a = [1, 2, 3, 4]

try:
    b = a.index(6)
    del a[b]
except:
    pass

print(a)

Aber gibt es nicht einen einfacheren Weg, dies zu tun?

10voto

Chase Adams Punkte 468

Dieses Beispiel ist schnell und löscht alle Instanzen eines Wertes aus der Liste:

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]

9voto

Das Auffinden eines Wertes in einer Liste und das anschließende Löschen dieses Indexes (sofern er existiert) ist einfacher, wenn man die remove-Methode von list verwendet:

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

Wenn Sie dies häufig tun, können Sie es in eine Funktion verpacken:

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass

6voto

SuperNova Punkte 20412

Wir können auch .pop verwenden:

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>>

5voto

Stefan Punkte 699

Viele der hier gegebenen Antworten betreffen die Erstellung einer neuen Liste. Dabei werden alle Daten der alten Liste in die neue Liste kopiert (mit Ausnahme der entfernten Einträge). Wenn Ihre Liste sehr umfangreich ist, können Sie sich das vielleicht nicht leisten (oder Sie sollten es nicht wollen).

In diesen Fällen ist es wesentlich schneller um die Liste an Ort und Stelle zu ändern. Wenn Sie mehr als ein Element aus der Liste entfernen müssen, kann es knifflig werden. Angenommen, Sie durchlaufen eine Schleife über die Liste und entfernen ein Element, dann ändert sich die Liste, und eine standardmäßige for-Schleife wird dies nicht berücksichtigen. Das Ergebnis der Schleife ist dann möglicherweise nicht das, was Sie erwartet haben.

Ejemplo:

a = [0, 1, 2, 3, 4, 5]
for i in a:
    a.remove(i)  # Remove all items
print(a)

Out: [1, 3, 5]

Eine einfache Lösung besteht darin, die Liste in umgekehrter Reihenfolge zu durchlaufen. In diesem Fall erhalten Sie:

a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    a.remove(i)  # Remove all items
print(a)

Out: []

Wenn Sie dann nur Elemente mit bestimmten Werten entfernen müssen, können Sie einfach eine if statement in der Schleife, was zu:

a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    if i == 2 or i == 3:  # Remove all items having value 2 or 3.
        a.remove(i)
print(a)

Out: [0, 1, 4, 5]

4voto

user7970984 Punkte 31

Mit einer for-Schleife und einer Bedingung:

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

Und wenn Sie einige entfernen wollen, aber nicht alle:

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X