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?

0voto

Mike Slinn Punkte 6880

Dies entfernt alle Instanzen von "-v" aus dem Array sys.argv und beschwert sich nicht, wenn keine Instanzen gefunden wurden:

while "-v" in sys.argv:
    sys.argv.remove('-v')

Sie können den Code in Aktion sehen, in einer Datei namens speechToText.py :

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']

0voto

David Martínez Punkte 49

Vielleicht Ihre Lösungen funktioniert mit ints, aber es Doesnt Arbeit für mich mit Wörterbüchern.

Auf der einen Seite hat remove() bei mir nicht funktioniert. Aber vielleicht funktioniert es mit Basic Types. Ich vermute, der Code unten ist auch der Weg, um Elemente aus der Liste der Objekte zu entfernen.

Andererseits hat auch die Funktion "del" nicht richtig funktioniert. In meinem Fall, bei Verwendung von Python 3.6: Wenn ich versuche, ein Element aus einer Liste in einem 'for'-Bucle mit dem 'del'-Befehl zu löschen, ändert Python den Index während des Prozesses und der Bucle stoppt vorzeitig vor der Zeit. Es funktioniert nur, wenn Sie Element für Element löschen in umgedreht bestellen. Auf diese Weise ändern Sie den Array-Index der ausstehenden Elemente nicht, wenn Sie ihn durchgehen

Dann werde ich gebraucht:

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

wobei 'list' wie [{'key1':value1'},{'key2':value2}, {'key3':value3}, ...] ist

Sie können auch mehr pythonic mit enumerate tun:

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)

0voto

guoxy2016 Punkte 1

Dies ist meine Antwort, verwenden Sie einfach während y für

def remove_all(data, value):
    i = j = 0
    while j < len(data):
        if data[j] == value:
            j += 1
            continue
        data[i] = data[j]
        i += 1
        j += 1
    for x in range(j - i):
        data.pop()

0voto

Benchmarking von einigen der einfachsten Methoden:

import random
from copy import copy
sample = random.sample(range(100000), 10000)
remove = random.sample(range(100000), 1000)

%%timeit
sample1 = copy(sample)
remove1 = copy(remove)

for i in reversed(sample1):
    if i in remove1:
        sample1.remove(i)
# 271 ms ± 16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# remove all instances

%%timeit
sample1 = copy(sample)
remove1 = copy(remove)

filtered = list(filter(lambda x: x not in remove1, sample1))
# 280 ms ± 18.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# remove all instances

%%timeit
sample1 = copy(sample)
remove1 = copy(remove) 

filtered = [ele for ele in sample1 if ele not in remove1]
# 293 ms ± 72.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# remove all instances

%%timeit
sample1 = copy(sample)
remove1 = copy(remove) 

for val in remove1:
    if val in sample1:
        sample1.remove(val)
# 558 ms ± 40.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# only remove first occurrence

%%timeit
sample1 = copy(sample)
remove1 = copy(remove) 

for val in remove1:
    try:
        sample1.remove(val)
    except:
        pass
# 609 ms ± 11.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# only remove first occurrence

0voto

p3_p3_ Punkte 1

Diese Lösung ist zwar weniger effizient, aber sie funktioniert trotzdem:

a = [ ] // das ist Ihre Liste

b // Element(e), die Sie löschen müssen

counter = a.count(b)

while counter > 0:
    if b in a:
       a.remove(b)
       counter -= 1

print(a)

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