Можно ли удалить несколько элементов из списка одновременно? Если я захочу удалить элементы с индексами 0 и 2 и попробовать что-то вроде del somelist[0]
, а затем del somelist[2]
второе утверждение фактически удалит somelist[3]
.
Я полагаю, что я всегда мог сначала удалить элементы с более высоким номером, но я надеюсь, что есть лучший способ.
somelist = [ lst[i] for i in xrange(len(lst)) if i not in set(indices) ]
?По какой-то причине мне не нравится ни один из ответов здесь. Да, они работают, но, строго говоря, большинство из них не удаляют элементы в списке, не так ли? (Но сделав копию, а затем заменив оригинал отредактированной копией).
Почему бы просто не удалить сначала более высокий индекс?
Для этого есть причина? Я бы просто сделал:
Если вы действительно не хотите удалять элементы задом наперед, тогда, я думаю, вам следует просто деинкрементировать значения индексов, которые больше, чем последний удаленный индекс (на самом деле нельзя использовать тот же индекс, поскольку у вас другой список), или использовать копия списка (которая не будет «удалять», а заменять оригинал отредактированной копией).
Я что-то здесь упускаю, есть ли причина НЕ удалять в обратном порядке?
источник
Если вы удаляете несколько несмежных элементов, то то, что вы описываете, является наилучшим способом (и да, обязательно начните с самого высокого индекса).
Если ваши элементы находятся рядом, вы можете использовать синтаксис назначения слайса:
источник
del a[2:10]
с тем же эффектом.Вы можете использовать
numpy.delete
следующим образом:Если вы не против получить
numpy
массив в конце, вы можете опустить.tolist()
. Вы также должны увидеть довольно значительные улучшения скорости, что делает это решение более масштабируемым. Я не тестировал его, ноnumpy
операции - это скомпилированный код, написанный на C или Fortran.источник
Как специализация ответа Грега, вы даже можете использовать расширенный синтаксис срезов. например. Если вы хотите удалить пункты 0 и 2:
Конечно, это не распространяется на произвольный выбор, но он может определенно работать для удаления любых двух элементов.
источник
Как функция:
Работает за время n log (n) , что должно сделать его самым быстрым и правильным решением.
источник
n log n
? В самом деле? Я не думаю, чтоdel list[index]
O (1).Итак, вы по сути хотите удалить несколько элементов за один проход? В этом случае позиция следующего удаляемого элемента будет смещена на сколько ранее было удалено.
Наша цель - удалить все гласные, которые предварительно рассчитаны как индексы 1, 4 и 7. Обратите внимание, что важно, чтобы индексы to_delete находились в порядке возрастания, иначе он не будет работать.
Было бы сложнее, если бы вы хотели удалить элементы в любом порядке. ИМО, сортировка
to_delete
может быть проще, чем выяснить, когда вы должны или не должны вычитать изindex
.источник
Я абсолютный новичок в Python, и мое программирование на данный момент грубое и грязное, если не сказать больше, но мое решение заключалось в использовании комбинации основных команд, которые я выучил в ранних уроках:
Очевидно, что из-за необходимости выбора символа «метка для удаления» это имеет свои ограничения.
Что касается производительности по мере масштабирования списка, я уверен, что мое решение не оптимально. Тем не менее, это просто, что, я надеюсь, понравится другим новичкам, и будет работать в простых случаях, когда
some_list
имеет широко известный формат, например, всегда числовой ...источник
Вот альтернатива, которая не использует enumerate () для создания кортежей (как в первоначальном ответе SilentGhost).
Это кажется более читабельным для меня. (Возможно, я бы почувствовал себя по-другому, если бы использовал привычку перечисления.) ПРЕДУПРЕЖДЕНИЕ. Я не проверял производительность двух подходов.
ПРИМЕЧАНИЕ. Синтаксис Python 2.7. Для Python 3
xrange
=>range
.Использование:
somelist:
--- БОНУС ---
Удалить несколько значений из списка. То есть у нас есть значения, которые мы хотим удалить:
Использование:
somelist:
Это тот же ответ, что и раньше, но на этот раз мы предоставили ЗНАЧЕНИЯ для удаления
[0, 44, 55]
.источник
[ value for (i, value) in enumerate(lst) if i not in set(indices) ]
. Но я оставлю здесь свой ответ, потому что я также показываю, как удалять по значениям. Что проще, но может кому-то помочь.indices_as_set = set(indices)
,[ value for (i, value) in enumerate(lst) if i not in indices_as_set ]
, ускорить его.delete__by_values()
?Альтернативный метод понимания списка, который использует значения индекса списка:
Это возвращает:
источник
index
вводит в заблуждение, поскольку в итераторе списка используется методindex()
Вот еще один метод, который удаляет элементы на месте. Кроме того, если ваш список очень длинный, это быстрее.
источник
Это было упомянуто, но так или иначе никто не сумел действительно понять это правильно.
По
O(n)
решению будет:Это действительно близко к версии SilentGhost , но добавляет две скобки.
источник
O(n)
если вы считаете количество поисков, которые берутсяlog(len(indices))
для каждой итерации.j not in indices
естьO(1)
.j not in indices
все еще требуется поиск, который естьO(log(len(indices)))
. Хотя я согласен, что поиск в 2-элементном наборе квалифицируется какO(1)
, в общем случае это будетO(log(N))
. В любом случаеO(N log(N))
все еще бьетO(N^2)
.j not in indices
этоO(1)
серьезно.По сути, это то же самое, что и ответ с наибольшим количеством голосов, просто другой способ его написания. Обратите внимание, что использование l.index () не очень хорошая идея, потому что он не может обрабатывать дублированные элементы в списке.
источник
Метод удаления вызовет большое смещение элементов списка. Я думаю, что лучше сделать копию:
источник
технически, ответ НЕТ, невозможно удалить два объекта ОДНОВРЕМЕННО. Тем не менее, возможно удалить два объекта в одной строке красивого питона.
восстановим
foo['bar']
, потомfoo['baz']
источник
мы можем сделать это с помощью цикла for, перебирающего индексы после сортировки списка индексов в порядке убывания
источник
Для индексов 0 и 2 из списка А:
Для удаления некоторых случайных индексов из списка A:
источник
Я хотел сравнить различные решения, которые позволили легко поворачивать ручки.
Сначала я сгенерировал свои данные:
Затем я определил свои функции:
Тогда я использовал
timeit
для сравнения решений:Вывод
Таким образом, генератор с индексами в
set
был победителем. Иdel
немного быстрее, чем тогдаpop
.источник
Вы можете использовать эту логику:
источник
Еще одна реализация идеи удаления из высшего индекса.
источник
Я действительно могу придумать два способа сделать это:
нарезать список как (это удаляет 1-й, 3-й и 8-й элементы)
somelist = somelist [1: 2] + somelist [3: 7] + somelist [8:]
сделать это на месте, но по одному:
somelist.pop (2) somelist.pop (0)
источник
Вы можете сделать это по указанию, а не по списку. В списке элементы расположены в последовательности. В диктовке они зависят только от индекса.
Простой код, чтобы объяснить это , выполнив :
Способ "преобразовать" список в dict:
Обратное:
В любом случае, я думаю, что лучше начинать удаление с более высокого индекса, как вы сказали.
источник
Обобщить комментарий от @sth . Удаление элемента в любом классе, который реализует abc.MutableSequence , и
list
в частности, выполняется с помощью__delitem__
магического метода. Этот метод работает аналогично__getitem__
, то есть он может принимать целое число или фрагмент. Вот пример:Это будет выводить
источник
Импортировать его только по этой причине может быть излишним, но если вы
pandas
все равно используете его , то решение простое и понятное:источник
Позволяет избежать стоимости сортировки и необходимости явно копировать список.
источник
Как насчет одного из них (я очень плохо знаком с Python, но они кажутся нормальными):
[«Атлантика», «Тихоокеанский», «Индийский»]
[«Атлантика», «Тихоокеанский», «Индийский»]
источник
Ни один из предложенных ответов пока не выполняет удаление в месте O (n) по длине списка для произвольного числа индексов, которые нужно удалить, поэтому вот моя версия:
источник
Вы также можете использовать удалить.
источник
Я собрал все это вместе в
list_diff
функцию, которая просто принимает два списка в качестве входных данных и возвращает их различие, сохраняя при этом первоначальный порядок первого списка.Пример использования:
источник