it-roy-ru.com

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

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

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

1175
Joan Venge

Используйте 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]

Здесь это раздел из учебника.

1384
unbeknown

Вы, вероятно, хотите 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']
554
Jarret Hardie

Как и другие упомянутые pop и del - это 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:])) и создает новый объект списка, добавляя оба. Затем он переназначается на переменную списка (a). Следовательно, старый объект списка разыменовывается и, следовательно, собирается сборщиком мусора (при условии, что на исходный объект списка не ссылается ни одна переменная, кроме a).

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

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

Это Ответ Stack Overflow объясняет концепцию нарезки.

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

При использовании с объектами должен быть определен метод __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.

114
Raghav RV

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

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

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

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

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

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

Если вы хотите вернуть удаленный элемент, используйте 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:]).

14
Neil Chowdhury

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

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 в y-1. Когда мы объявляем эту часть списка как пустой список ([]), эти элементы удаляются.

11
Andreas Chatzivasileiadis

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

    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

9
SollyBunny

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

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]
7
jitesh mohite

Как упоминалось ранее, наилучшей практикой является 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']

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

Я полагаю 

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

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

размышлял

6
litepresence

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

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

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

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]
6
Jo Ja

Используйте функцию "del"

del listName[-N]

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

del listName[-3:]

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

del listName[-8:]
5
lloydyu24

Если вы хотите удалить определенный элемент позиции в списке, например, 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]]
5
xiaojia zhang

Можно использовать либо 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]
1
pyman

Но никогда не используйте pop () с циклом .it приведет к ошибке .use pop () без цикла.

0
DeV

Или, если несколько индексов должны быть удалены:

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])
0
U9-Forward

Вы можете использовать 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]
>>> 
0
Aashutosh jha