In Python remove()
entfernt das erste Vorkommen eines Wertes in einer Liste.
So entfernen Sie todo Vorkommen eines Wertes in einer Liste?
Das ist es, was ich im Sinn habe:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
In Python remove()
entfernt das erste Vorkommen eines Wertes in einer Liste.
So entfernen Sie todo Vorkommen eines Wertes in einer Liste?
Das ist es, was ich im Sinn habe:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Alle oben genannten Antworten (außer der von Martin Andersson) erstellen eine neue Liste ohne die gewünschten Elemente, anstatt die Elemente aus der ursprünglichen Liste zu entfernen.
>>> import random, timeit
>>> a = list(range(5)) * 1000
>>> random.shuffle(a)
>>> b = a
>>> print(b is a)
True
>>> b = [x for x in b if x != 0]
>>> print(b is a)
False
>>> b.count(0)
0
>>> a.count(0)
1000
>>> b = a
>>> b = filter(lambda a: a != 2, x)
>>> print(b is a)
False
Dies kann wichtig sein, wenn Sie noch andere Verweise auf die Liste haben.
Um die Liste an Ort und Stelle zu ändern, verwenden Sie eine Methode wie diese
>>> def removeall_inplace(x, l):
... for _ in xrange(l.count(x)):
... l.remove(x)
...
>>> removeall_inplace(0, b)
>>> b is a
True
>>> a.count(0)
0
Was die Geschwindigkeit anbelangt, so sind die Ergebnisse auf meinem Laptop (bei einer Liste mit 5000 Einträgen, aus der 1000 Einträge entfernt wurden)
Die .remove-Schleife ist also etwa 100x langsamer........ Hmmm, vielleicht ist ein anderer Ansatz erforderlich. Die schnellste, die ich gefunden habe, ist die Verwendung der Liste Verständnis, aber dann ersetzen Sie den Inhalt der ursprünglichen Liste.
>>> def removeall_replace(x, l):
.... t = [y for y in l if y != x]
.... del l[:]
.... l.extend(t)
Numpy-Ansatz und Zeitangaben für eine Liste/Array mit 1.000.000 Elementen:
Zeitplan:
In [10]: a.shape
Out[10]: (1000000,)
In [13]: len(lst)
Out[13]: 1000000
In [18]: %timeit a[a != 2]
100 loops, best of 3: 2.94 ms per loop
In [19]: %timeit [x for x in lst if x != 2]
10 loops, best of 3: 79.7 ms per loop
Schlussfolgerung: numpy ist 27-mal schneller (auf meinem Notebook) als der Ansatz des Listenverständnisses
PS: Wenn Sie Ihre reguläre Python-Liste konvertieren möchten lst
in ein Numpy-Array:
arr = np.array(lst)
Einrichten:
import numpy as np
a = np.random.randint(0, 1000, 10**6)
In [10]: a.shape
Out[10]: (1000000,)
In [12]: lst = a.tolist()
In [13]: len(lst)
Out[13]: 1000000
Prüfen:
In [14]: a[a != 2].shape
Out[14]: (998949,)
In [15]: len([x for x in lst if x != 2])
Out[15]: 998949
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.