如何通过索引从列表中删除元素?

如何在 Python 中按索引从列表中删除元素?

我找到了list.remove方法,但是说我想删除最后一个元素,该怎么做?似乎默认的 remove 搜索列表,但是我不希望执行任何搜索。

答案

使用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']

像其他提到的一样,pop 和 del 是删除给定索引项有效方法。只是为了完成(因为可以通过 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]

注意:请注意,此方法不会像popdel那样就地修改列表。相反,它制作了两个列表副本(一个从开始到索引,但没有它( a[:index] ),一个在索引之后到最后一个元素( a[index+1:] ),并创建一个新的列表对象通过添加两者。然后将其重新分配给列表变量( a )。因此,旧列表对象被取消引用并因此被垃圾回收(前提是原始列表对象未被 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 )

这与定义__getitem____add__方法的list __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

slice 和 add 方法。

效率最低。

码:

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 。同样,前两行正在加载全局值aindex

pop还可从列表中删除并保留项目。 del实际上是在哪里丢弃该项目。

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

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

这取决于您要做什么。

如果要返回删除的元素,请使用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:] )。

通常,我使用以下方法:

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

如果要删除列表中的特定位置元素,例如 2th,3th 和 7th。你不能使用

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

由于删除第二个元素后,实际上删除的第三个元素是原始列表中的第四个元素。您可以过滤原始列表中的 2th,3th 和 7th 元素并获得一个新列表,如下所示:

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

通过索引从列表中删除元素的另一种方法。

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] 指向从索引xy-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)

输出:acde

使用以下代码从列表中删除元素:

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]