Этот вопрос был дан ответ, но я wan чтобы использовать комментарий, который использует понимание списков намного медленнее, чем использование .remove()
.
Некоторые профили с моей машины (с использованием 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
Если вы используете самый быстрый способ скопировать список (который не очень читаемый), то будет около 36% быстрее, чем при использовании списка понимания. Но если вы скопируете список, используя класс list()
(что гораздо более распространено и Pythonic), то вы будете на 26% медленнее, чем использование списка.
Действительно, все довольно быстро. Я думаю, что можно аргументировать, что .remove()
более читабельна, чем перечислить технику понимания списка, но это не обязательно быстрее, если вы не заинтересованы в отказе от чтения в дублировании.
Большое преимущество понимания списка в этом сценарии состоит в том, что оно гораздо более кратким (т. Е. Если у вас была функция, которая по какой-то причине удаляла элемент из данного списка, это можно сделать в 1 строке, в то время как другой метод потребует 3 строки.) Бывают моменты, когда однострочные могут быть очень удобными (хотя они обычно приходят за счет некоторой удобочитаемости). Кроме того, использование понимания списка превосходит в том случае, если вы действительно не знаете, действительно ли элемент, который нужно удалить, в самом начале списка. Пока .remove()
выкинет ValueError
, понимание списка будет действовать, как ожидалось.
Есть ли способ сделать это без изменения исходного списка? – AsheKetchum