Как удалить элемент из списка по индексу в Python?

Как удалить элемент из списка по индексу в Python?

нашел list.remove метод, но, скажем, я хочу удалить последний элемент, как это сделать? Похоже, что удаление по умолчанию ищет список, но я не хочу, чтобы какой-либо поиск выполнялся.

18 ответов


использовать del и указать индекс элемента, который вы хотите удалить:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]

также поддерживает ломтиками:

>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]

здесь раздел из учебника.


вы, вероятно, хотите pop:

a = ['a', 'b', 'c', 'd']
a.pop(1)

# now a is ['a', 'c', 'd']

по умолчанию pop без каких-либо аргументов удаляет последний элемент:

a = ['a', 'b', 'c', 'd']
a.pop()

# now a is ['a', 'b', 'c']

как и другие упомянутые поп и Дель the эффективные способы удаления элемента данного индекса. Но только ради завершения (так как то же самое можно сделать многими способами в Python):

использование ломтиков (это не делает на месте удаления элемента из исходного списка):

(также это будет наименее эффективный метод при работе со списком Python, но это может быть полезно (но не эффективно, я повторяю) при работе с определенными пользователем объектами, которые не поддерживают pop, но определяют __getitem__ ):

>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index

>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]

Примечание: обратите внимание, что этот метод не изменяет список на месте, как pop и del. Вместо этого он делает две копии списков (один от начала до индекса, но без него (a[:index]) и один после индекса до последнего элемента (a[index+1:])) и создает новый объект списка, добавляя оба. Затем он переназначается в переменную list (a). Старое объект list, следовательно, разыменован и, следовательно, собран мусор (при условии, что исходный объект list не ссылается на какую-либо переменную, кроме a).

это делает этот метод очень неэффективным, и он также может создавать нежелательные побочные эффекты (особенно когда другие переменные указывают на исходный объект списка, который остается неизмененным).

спасибо @MarkDickinson за указание на это ...

этой ответ переполнения стека объясняет концепция нарезки.

Также обратите внимание, что это работает только с позитивных показателей.

при использовании с объектами,__getitem__ метод должен быть определен и, что более важно __add__ метод должен быть определен для возврата объекта, содержащего элементы из обоих операндов.

по сути, это работает с любым объектом, определение класса которого похоже:

class foo(object):
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return foo(self.items[index])

    def __add__(self, right):
        return foo( self.items + right.items )

работает с list определяет __getitem__ и __add__ методы.

сравнение трех способов с точки зрения эффективности:

предположим, что предопределено следующее:

a = range(10)
index = 3

на del object[index] способ:

безусловно, самый эффективный метод. Он работает все объекты, которые определяют __del__ метод.

разборки в следует:

код:

def del_method():
    global a
    global index
    del a[index]

разборки:

 10    0 LOAD_GLOBAL     0 (a)
       3 LOAD_GLOBAL     1 (index)
       6 DELETE_SUBSCR   # This is the line that deletes the item
       7 LOAD_CONST      0 (None)
      10 RETURN_VALUE
None

pop способ:

он менее эффективен, чем метод Del и используется, когда вам нужно получить удаленный элемент.

код:

def pop_method():
    global a
    global index
    a.pop(index)

разборки:

 17     0 LOAD_GLOBAL     0 (a)
        3 LOAD_ATTR       1 (pop)
        6 LOAD_GLOBAL     2 (index)
        9 CALL_FUNCTION   1
       12 POP_TOP
       13 LOAD_CONST      0 (None)
       16 RETURN_VALUE

метод среза и добавления.

по крайней мере эффективный.

код:

def slice_method():
    global a
    global index
    a = a[:index] + a[index+1:]

разборки:

 24     0 LOAD_GLOBAL    0 (a)
        3 LOAD_GLOBAL    1 (index)
        6 SLICE+2
        7 LOAD_GLOBAL    0 (a)
       10 LOAD_GLOBAL    1 (index)
       13 LOAD_CONST     1 (1)
       16 BINARY_ADD
       17 SLICE+1
       18 BINARY_ADD
       19 STORE_GLOBAL   0 (a)
       22 LOAD_CONST     0 (None)
       25 RETURN_VALUE
None

Примечание: во всех трех разборках игнорируйте последние две строки, которые в основном являются return None. Также первые две строки загружают глобальные значения a и index.


pop также полезно удалить и сохранить элемент из списка. Где del фактически уничтожает элемент.

>>> x = [1, 2, 3, 4]

>>> p = x.pop(1)
>>> p
    2

как правило, я использую следующий метод:

>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]

это зависит от того, что вы хотите сделать.

если вы хотите вернуть элемент, который вы удалили, используйте pop():

>>> l = [1, 2, 3, 4, 5]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5]

однако, если вы просто хотите удалить элемент, используйте del:

>>> l = [1, 2, 3, 4, 5]
>>> del l[2]
>>> l
[1, 2, 4, 5]

кроме того, del позволяет использовать ломтики (например,del[2:]).


еще один способ, чтобы удалить элемент(ы) из списка по индексу.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# remove the element at index 3
a[3:4] = []
# a is now [0, 1, 2, 4, 5, 6, 7, 8, 9]

# remove the elements from index 3 to index 6
a[3:7] = []
# a is now [0, 1, 2, 7, 8, 9]

a[x:y] указывает на элементы из индекса x to y-1. Когда мы объявляем эту часть списка пустым списком (), эти элементы.


вы можете просто найти элемент, который хотите удалить. Это очень просто. Пример:

    letters = ["a", "b", "c", "d", "e"]
    letters.remove(letters[1])
    print(*letters) # Used with a * to make it unpack you don't have to (Python 3.x or newer)

выход: A c d e


используйте следующий код для удаления элемента из списка:

list = [1, 2, 3, 4]
list.remove(1)
print(list)

output = [2, 3, 4]

Если вы хотите удалить данные элемента индекса из списка, используйте:

list = [1, 2, 3, 4]
list.remove(list[2])
print(list)
output : [1, 2, 4]

Как упоминалось ранее, лучшей практикой является del (); или pop (), если вам нужно знать значение.

альтернативным решением является повторный стек только тех элементов, которые вы хотите:

    a = ['a', 'b', 'c', 'd'] 

    def remove_element(list_,index_):
        clipboard = []
        for i in range(len(list_)):
            if i is not index_:
                clipboard.append(list_[i])
        return clipboard

    print(remove_element(a,2))

    >> ['a', 'b', 'd']

eta: хмм... не будет работать на отрицательных значениях индекса, будет обдумывать и обновления

Я думаю

if index_<0:index_=len(list_)+index_

ввожу его... но внезапно эта идея кажется очень хрупкой. Интересный мысленный эксперимент. Кажется, должен быть "правильный" способ сделать это с append () / понимание списка.

размышление


не похоже, что вы работаете со списком списков, поэтому я буду краток. Вы хотите использовать pop, так как он удалит элементы, а не элементы, которые являются списками, вы должны использовать del для этого. Чтобы вызвать последний элемент в python, это "-1"

>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']

использовать "дель" функция:

del listName[-N]

например, если вы хотите удалить последние 3 предметы, ваш код должен быть:

del listName[-3:]

например, если вы хотите удалить последние 8 элементов, ваш код должен быть:

del listName[-8:]

l - список значений, мы должны удалить индексы с inds2rem список.

l = range(20)
inds2rem = [2,5,1,7]
map(lambda x: l.pop(x), sorted(inds2rem, key = lambda x:-x))

>>> l
[0, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

можно использовать del или pop, но я предпочитаю del, так как вы можете указать индекс и срезы, давая пользователю больше контроля над данными.

например, начиная со списка показано, можно удалить его последний элемент с del Как нарезать, а затем можно удалить последний элемент из результата, используя pop.

>>> l = [1,2,3,4,5]
>>> del l[-1:]
>>> l
[1, 2, 3, 4]
>>> l.pop(-1)
4
>>> l
[1, 2, 3]

Если вы хотите удалить конкретный элемент позиции в списке, например 2-й, 3-й и 7-й. вы не можете использовать

del my_list[2]
del my_list[3]
del my_list[7]

поскольку после удаления второго элемента третий элемент, который вы удаляете, фактически является четвертым элементом в исходном списке. Вы можете отфильтровать 2-й, 3-й и 7-й элемент в исходном списке и получить новый список, как показано ниже:

new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]]

вы можете использовать del или pop для удаления элемента из списка на основе индекса. Pop будет печатать элемент, который он удаляет из списка, в то время как список удаляет этот элемент без его печати.

>>> a=[1,2,3,4,5]
>>> del a[1]
>>> a
[1, 3, 4, 5]
>>> a.pop(1)
 3
>>> a
[1, 4, 5]
>>> 

Вы можете просто использовать remove функция Python. Вот так:

v = [1, 2, 3, 4, 5, 6]
v.remove(v[4]) # I'm removing the number with index 4 of my array
print(v) # If you want verify the process

# It gave me this:
#[1,2,3,4,6]

или если необходимо удалить несколько индексов:

print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])

конечно, тогда также можно было бы сделать:

print([v for i,v in enumerate(your_list) if i != unwanted_index])