547 Stimmen

Alle Vorkommen eines Wertes aus einer Liste entfernen?

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]

25voto

Amr Punkte 1725

Bessere Lösung mit Listenverständnis

x = [ i for i in x if i!=2 ]

15voto

Paul S Punkte 7485

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)

  • Verständnis der Liste - ~400us
  • Filter - ~900us
  • .remove() Schleife - 50ms

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)
  • removeall_replace() - 450us

6voto

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

5voto

Jared Burrows Punkte 52572

Um alle doppelten Einträge zu entfernen und einen in der Liste zu belassen:

test = [1, 1, 2, 3]

newlist = list(set(test))

print newlist

[1, 2, 3]

Hier ist die Funktion, die ich für das Projekt Euler verwendet habe:

def removeOccurrences(e):
  return list(set(e))

5voto

Ankit Sharma Punkte 1115
a = [1, 2, 2, 3, 1]
to_remove = 1
a = [i for i in a if i != to_remove]
print(a)

Vielleicht nicht die pythonischste, aber immer noch die einfachste für mich, haha

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