Как удалить элемент из списка по индексу в Python?
Я нашел list.remove
метод, но говорю, что хочу удалить последний элемент, как мне это сделать? Похоже, что удаление по умолчанию выполняет поиск в списке, но я не хочу, чтобы какой-либо поиск выполнялся.
O(n)
во времени.deque()
обеспечивает эффективные операции на обоих концах, но не обеспечивает O (1) вставок / поисков / удалений в середине.O(n)
индексный доступa[i]
(из-за связанных списков). Примечание: реализация на основе массива обеспечиваетO(1)
доступ к индексу.Ответы:
Используйте
del
и укажите индекс элемента, который вы хотите удалить:Также поддерживает ломтики:
Вот раздел из учебника.
источник
PyList_GetItem()
существу возвращает((PyListObject *)op) -> ob_item[i];
-i
th-й элемент массива.Вы, вероятно, хотите
pop
:По умолчанию
pop
без каких-либо аргументов удаляется последний элемент:источник
pop()
сама по себе она очень очевидна, хотяpop(-1)
потенциально может сбить с толку именно потому, что она избыточна.pop
в большинстве языков программирования обычно удаляет последний элемент, как в Python. Так что, указываете ли вы -1 или ничего не одно и то же.pop()
возвращает любой удаленный элемент.Как и другие упомянутых попы и дель являются этими эффективными способами удаления элемента из данного индекса. Тем не менее, просто для завершения (поскольку то же самое можно сделать разными способами в Python):
Использование срезов (это не означает удаление элемента из исходного списка):
(Также это будет наименее эффективный метод при работе со списком Python, но это может быть полезно (но неэффективно, я повторяю) при работе с пользовательскими объектами, которые не поддерживают pop, но все же определяют a
__getitem__
):Примечание: обратите внимание, что этот метод не изменяет список на месте, как
pop
иdel
. Вместо этого он создает две копии списков (один от начала до индекса, но без него (a[:index]
) и один после индекса до последнего элемента (a[index+1:]
)) и создает новый объект списка, добавляя оба. Затем он переназначается на переменную списка (a
). Таким образом, старый объект списка разыменовывается и, следовательно, собирается сборщиком мусора (при условии, что на исходный объект списка не ссылаются никакие переменные, кроме a).Это делает этот метод очень неэффективным и может также вызывать нежелательные побочные эффекты (особенно, когда другие переменные указывают на исходный объект списка, который остается неизменным).
Спасибо @MarkDickinson за указание на это ...
Этот ответ переполнения стека объясняет концепцию нарезки.
Также обратите внимание, что это работает только с положительными показателями.
При использовании с объектами
__getitem__
должен быть определен метод, и, что более важно,__add__
должен быть определен метод для возврата объекта, содержащего элементы из обоих операндов.По сути, это работает с любым объектом, чье определение класса похоже на:
Это работает с
list
которой определяет__getitem__
и__add__
методы.Сравнение трех способов с точки зрения эффективности:
Предположим, что предопределено следующее:
del object[index]
Метод:Безусловно, самый эффективный метод. Это будет работать со всеми объектами, которые определяют
__del__
метод.Разборка заключается в следующем:
Код:
Разборка:
pop
метод:Он менее эффективен, чем метод del, и используется, когда вам нужно получить удаленный элемент.
Код:
Разборка:
Метод среза и добавления.
Наименее эффективный.
Код:
Разборка:
Примечание: во всех трех разборках игнорируйте последние две строки, которые в основном есть
return None
. Также первые две строки загружают глобальные значенияa
иindex
.источник
a = a[:index] + a[index+1 :]
трюк был самым безопасным, когда дело доходит до огромных списков. Все остальные методы оказались в тупике. Так что большое спасибоpop
также полезно удалить и сохранить элемент из списка. Где наdel
самом деле разбивает предмет.источник
Если вы хотите удалить определенный элемент позиции в списке, например, 2-й, 3-й и 7-й. ты не можешь использовать
Поскольку после удаления второго элемента третий удаляемый элемент фактически является четвертым элементом в исходном списке. Вы можете отфильтровать 2-й, 3-й и 7-й элемент в исходном списке и получить новый список, как показано ниже:
источник
Это зависит от того, что вы хотите сделать.
Если вы хотите вернуть удаленный элемент, используйте
pop()
:Однако, если вы просто хотите удалить элемент, используйте
del
:Кроме того,
del
позволяет использовать ломтики (напримерdel[2:]
).источник
Как правило, я использую следующий метод:
источник
Еще один способ удалить элемент (ы) из списка по индексу.
a [x: y] указывает на элементы из индекса
x
вy-1
. Когда мы объявляем эту часть списка как пустой список ([]
), эти элементы удаляются.источник
Вы можете просто найти элемент, который вы хотите удалить. Это действительно просто. Пример:
Выход: acde
источник
Используйте следующий код для удаления элемента из списка:
Если вы хотите удалить данные элемента индекса из списка, используйте:
источник
Как упоминалось ранее, наилучшей практикой является del (); или pop (), если вам нужно знать значение.
Альтернативное решение состоит в том, чтобы повторно сложить только те элементы, которые вы хотите:
eta: хмм ... не будет работать с отрицательными значениями индекса, будет обдумывать и обновлять
Я предполагаю
залатать это ... но вдруг эта идея кажется очень хрупкой. Интересный мысленный эксперимент. Кажется, должен быть «правильный» способ сделать это с помощью append () / списка.
обдумывание
источник
del()
? Для этой функции вы предоставляете список в качестве первого аргумента этой функции, а затем индекс или сначала индекс, а затем список? Возвращает ли он аргумент списка без элемента или выполняет удаление на месте. Я знаю обdel
утверждении, но не о функции с тем же именем.Не похоже, что вы работаете со списком списков, поэтому я буду кратким. Вы хотите использовать pop, так как он удалит элементы, а не элементы, которые являются списками, для этого следует использовать del. Для вызова последнего элемента в Python это "-1"
источник
pop()
иdel
оба удаляют элемент по указанному индексу, независимо от того, является ли этот элемент списком или нет.a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
l - список значений; мы должны удалить индексы из списка inds2rem .
источник
<map at 0x7f4d54109a58>
. и l это диапазон (0,20)Используйте функцию "del" :
Например, если вы хотите удалить последние 3 элемента, ваш код должен быть:
Например, если вы хотите удалить последние 8 элементов, ваш код должен быть:
источник
del
это утверждение . Если бы это была функция, вы должны были бы написатьdel(listame[-N])
Уже упоминалось, как удалить один элемент из списка и какие преимущества имеют различные методы. Обратите внимание, что удаление нескольких элементов может привести к ошибкам:
Элементы 3 и 8 (не 3 и 7) исходного списка были удалены (так как список был сокращен во время цикла), что могло и не быть намерением. Если вы хотите безопасно удалить несколько индексов, вы должны сначала удалить элементы с самым высоким индексом, например, так:
источник
Или, если несколько индексов должны быть удалены:
Конечно, тогда также можно сделать:
источник
Вы можете использовать del или pop для удаления элемента из списка на основе индекса. Pop напечатает участника, которого он удаляет из списка, в то время как список удалит этого участника, не печатая его.
источник
Можно использовать либо del, либо pop, но я предпочитаю del, поскольку вы можете указать индекс и срезы, предоставляя пользователю больший контроль над данными.
Например, начиная с показанного списка, можно удалить его последний элемент
del
как срез, а затем можно удалить последний элемент из результата, используяpop
.источник