Das Löschen von Listenelementen in-situ ist möglich, aber nicht durch Vorwärtsgehen der Liste. Ihr Code funktioniert einfach nicht - wenn die Liste schrumpft, können Sie Elemente übersehen. Du musst rückwärts gehen, so dass der schrumpfende Teil hinter dir ist, mit ziemlich schrecklichem Code. Bevor ich Ihnen das zeige, gibt es einige Vorüberlegungen:
Erstens, wie ist dieser Müll in die Liste gekommen? Vorbeugung ist besser als Heilung.
Zweitens, wie viele Elemente in der Liste und wie viel Prozent müssen wahrscheinlich gelöscht werden? Je höher der Prozentsatz, desto größer die Wahrscheinlichkeit, dass es besser ist, eine neue Liste zu erstellen.
OK, wenn Sie es noch in-situ tun wollen, betrachten dies:
def list_cleanup_fail(alist, is_bad):
i = 0
for element in alist:
print "i=%d alist=%r alist[i]=%d element=%d" % (i, alist, alist[i], element)
if is_bad(element):
del alist[i]
i += 1
def list_cleanup_ok(alist, is_bad):
for i in xrange(len(alist) - 1, -1, -1):
print "i=%d alist=%r alist[i]=%d" % (i, alist, alist[i])
if is_bad(alist[i]):
del alist[i]
def is_not_mult_of_3(x):
return x % 3 != 0
for func in (list_cleanup_fail, list_cleanup_ok):
print
print func.__name__
mylist = range(11)
func(mylist, is_not_mult_of_3)
print "result", mylist
und hier ist die Ausgabe:
list_cleanup_fail
i=0 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=0 element=0
i=1 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=1 element=1
i=2 alist=[0, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=3 element=3
i=3 alist=[0, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=4 element=4
i=4 alist=[0, 2, 3, 5, 6, 7, 8, 9, 10] alist[i]=6 element=6
i=5 alist=[0, 2, 3, 5, 6, 7, 8, 9, 10] alist[i]=7 element=7
i=6 alist=[0, 2, 3, 5, 6, 8, 9, 10] alist[i]=9 element=9
i=7 alist=[0, 2, 3, 5, 6, 8, 9, 10] alist[i]=10 element=10
result [0, 2, 3, 5, 6, 8, 9]
list_cleanup_ok
i=10 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=10
i=9 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] alist[i]=9
i=8 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] alist[i]=8
i=7 alist=[0, 1, 2, 3, 4, 5, 6, 7, 9] alist[i]=7
i=6 alist=[0, 1, 2, 3, 4, 5, 6, 9] alist[i]=6
i=5 alist=[0, 1, 2, 3, 4, 5, 6, 9] alist[i]=5
i=4 alist=[0, 1, 2, 3, 4, 6, 9] alist[i]=4
i=3 alist=[0, 1, 2, 3, 6, 9] alist[i]=3
i=2 alist=[0, 1, 2, 3, 6, 9] alist[i]=2
i=1 alist=[0, 1, 3, 6, 9] alist[i]=1
i=0 alist=[0, 3, 6, 9] alist[i]=0
result [0, 3, 6, 9]
Ich glaube, dass diese Denkweise mehr Mühe ist finden als es wert ist. Kopieren Sie einfach die Liste, ändern Sie sie und geben Sie die geänderte Kopie zurück. Eine Liste an Ort und Stelle zu ändern, während sie wiederholt wird, verlangt nur nach Kopfschmerzen. – jathanism
'del' ist eine Aussage, keine Funktion. Wickeln Sie das Argument nicht in Klammern. – jemfinch
Die Größe des Objekts "in der Liste" ist irrelevant, da Python das Objekt nicht in der Liste speichert; Es speichert einen Verweis auf das Objekt.Daher beziehen sich Leistungsprobleme auf die Länge der Liste und den Algorithmus, der für die Bearbeitung der Liste verwendet wird, und nicht auf die Größe der Objekte, auf die Bezug genommen wird. – Nathan