Вот альтернатива, которая не использует перечисление() для создания кортежей (как в оригинальном ответе SilentGhost).
Это кажется более читаемым для меня. (Может быть, я буду чувствовать себя иначе, если бы у меня была привычка использовать перечисление.) CAVEAT: Я не тестировал производительность двух подходов.
# Returns a new list. "lst" is not modified.
def delete_by_indices(lst, indices):
indices_as_set = set(indices)
return [ lst[i] for i in xrange(len(lst)) if i not in indices_as_set ]
ПРИМЕЧАНИЕ: Синтаксис Python 2.7. Для Python 3, xrange
=>range
.
Использование:
lst = [ 11*x for x in xrange(10) ]
somelist = delete_by_indices(lst, [0, 4, 5])
somelist:
[11, 22, 33, 66, 77, 88, 99]
--- БОНУС ---
Удаление нескольких значений из списка. То есть, у нас есть ценности, которые мы хотим удалить:
# Returns a new list. "lst" is not modified.
def delete__by_values(lst, values):
values_as_set = set(values)
return [ x for x in lst if x not in values_as_set ]
Использование:
somelist = delete__by_values(lst, [0, 44, 55])
somelist:
[11, 22, 33, 66, 77, 88, 99]
Это тот же ответ, как и раньше, но на этот раз мы поставили ЦЕННОСТИ, подлежащие удалению [0, 44, 55]
.
Почти, только если вы удалите весь список. это будет len (индексы) * len (somelist). Он также создает копию, которая может быть или не нужна. –
поиск не является линейным – SilentGhost
, если вы проверяете значение в списке, это так. оператор «in» работает с значениями списка, тогда как он работает с ключами dict. Если я ошибаюсь, укажите мне pep/reference –