soword科技言
永久公益免费API接口
提供永久免费的API接口,查看更多API接口,如果您有其他免费API资源,请联系我们,造福人类。
提供商务开发:小程序,系统,APP
定制开发,免费评估,免费咨询,价格便宜,售后保障,前往开发服务中心联系开发客服中心
如何通过索引从列表中删除元素?

如何在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的用户定义对象但确实定义a时,这可能会很有用(我重申这是无效的__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 = itemsdef __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 aglobal indexdel a[index]

拆卸:

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

pop 方法:

它比del方法效率低,在需要获取已删除项目时使用。

码:

def pop_method():
global aglobal 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_CONST0 (None)
 16 RETURN_VALUE

slice和add方法。

效率最低。

码:

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

拆卸:

 24 0 LOAD_GLOBAL0 (a)
3 LOAD_GLOBAL1 (index)
6 SLICE+2
7 LOAD_GLOBAL0 (a)
 10 LOAD_GLOBAL1 (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_VALUENone

注意:在所有三个反汇编中,忽略最后两行,它们基本上是return None同样,前两行正在加载全局值aindex



2023-03-22 10:04:19

新人小程序+APP定制199元起


发放福利,助力中小企业发展,真正在互联网中受益

点击询问定制

广告服务展示