如何通过Python中的索引从列表中删除元素?
如何通过Python中的索引从列表中删除元素?
我找到了list.remove
方法,但说我想删除最后一个元素,我该怎么做? 它似乎像默认删除搜索列表,但我不希望执行任何搜索。
使用del
并用索引指定要删除的元素:
In [9]: a = list(range(10))
In [10]: a
Out[10]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [11]: del a[-1]
In [12]: a
Out[12]: [0, 1, 2, 3, 4, 5, 6, 7, 8]
以下是教程中的部分。
你可能想要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 ]
注意:请注意,这种方法不会像pop
和del
一样修改就地列表。 它会创建两个副本(一个从开始到索引但没有它( 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
。
效率方面三种方式的比较:
假定以下是预定义的:
a = range(10)
index = 3
del object[index]
方法:
迄今为止最有效的方法。 Works将定义一个__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
注意:在所有三个反汇编忽略最后2行基本上return None
也前两行加载全局值a
和index
。
上一篇: How to remove an element from a list by index in Python?