Diese Frage wurde beantwortet, aber ich wan ted, um den Kommentar zu adressieren, dass die Verwendung des Listenverständnisses viel langsamer ist als die Verwendung von .remove()
.
Einige Profile von meinem Computer (mit Python 2.7.6).
%%timeit
x = ['a', 'b', 'c', 'd']
y = x[:] # fastest way to copy
y.remove('c')
1000000 loops, best of 3: 405 ns per loop
%%timeit
x = ['a', 'b', 'c', 'd']
y = list(x) # not as fast copy
y.remove('c')
1000000 loops, best of 3: 689 ns per loop
%%timeit
x = ['a', 'b', 'c', 'd']
y = [n for n in x if n != 'c'] # list comprehension
1000000 loops, best of 3: 544 ns per loop
Wenn Sie den schnellsten Weg, um eine Liste zu kopieren (was nicht sehr gut lesbar ist), werden Sie ca. 36% schneller als Liste Verständnis mit. Aber wenn Sie die Liste kopieren, indem Sie die list()
Klasse verwenden (die viel häufiger und Pythonic ist), dann werden Sie 26% langsamer sein als das Listenverständnis zu verwenden.
Wirklich, es ist alles ziemlich schnell. Ich denke, das Argument könnte gemacht werden, dass .remove()
besser lesbar ist, als eine List-Verständnis-Technik aufzulisten, aber es ist nicht unbedingt schneller, es sei denn, Sie sind daran interessiert, die Lesbarkeit in der Duplizierung aufzugeben. Der große Vorteil des Listenverständnisses in diesem Szenario ist, dass es viel prägnanter ist (dh wenn Sie eine Funktion hatten, die aus irgendeinem Grund ein Element aus einer gegebenen Liste entfernen sollte, könnte dies in einer Zeile erfolgen, während die eine andere Methode würde 3 Zeilen erfordern.) Es gibt Zeiten, in denen Einzeiler sehr handlich sein können (obwohl sie typischerweise auf Kosten einiger Lesbarkeit gehen). Wenn Sie nicht wirklich wissen, ob das Element, das entfernt werden soll, tatsächlich in der Liste ist, ist das Verwenden von List-Verständnis in dem Fall von Vorteil. Während .remove()
einen ValueError
wirft, funktioniert Listenverstehen wie erwartet.
Gibt es eine Möglichkeit, dies zu tun, ohne die ursprüngliche Liste zu ändern? – AsheKetchum