2024-04-23 10:32:08 发布
网友
如何在Python中通过索引从列表中删除元素?
我找到了list.remove方法,但是说我想删除最后一个元素,我该怎么做?看起来默认的remove搜索列表,但我不希望执行任何搜索。
list.remove
使用del并指定要删除的元素的索引:
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]
Here是教程中的一节。
你可能想要pop:
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 list时,这也是效率最低的方法,但在使用不支持pop但定义了__getitem__的用户定义对象时,这可能是有用的(但我重申,效率不高):
__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之外的任何变量引用)。
a[:index]
a[index+1:]
a
这使得这个方法非常低效,而且它也会产生不希望的副作用(特别是当其他变量指向原始列表对象时,该列表对象仍然未被修改)。
感谢@MarkDickinson指出这一点。。。
This堆栈溢出答案解释了切片的概念。
还要注意,这只适用于正指数。
在与对象一起使用时,必须定义__getitem__方法,更重要的是,必须定义__add__方法以返回包含两个操作数中的项的对象。
__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一起工作。
list
三种方法在效率方面的比较:
假设以下是预定义的:
a = range(10) index = 3
方法:
目前为止最有效的方法。它可以工作,所有定义__del__方法的对象都可以工作。
__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。
return None
index
使用
del
并指定要删除的元素的索引:还支持切片:
Here是教程中的一节。
你可能想要
pop
:默认情况下,
pop
不带任何参数将删除最后一项:与其他提到的pop和del一样,是删除给定索引项的有效方法。然而,仅仅是为了完成(因为在Python中,同样的事情可以通过多种方式完成):
使用切片(这不会就地从原始列表中删除项目):
(在使用Python list时,这也是效率最低的方法,但在使用不支持pop但定义了
__getitem__
的用户定义对象时,这可能是有用的(但我重申,效率不高):注意:请注意,此方法不会像
pop
和del
那样修改列表。相反,它会生成两个列表副本(一个从开始到索引,但没有它(a[:index]
),一个在索引之后,直到最后一个元素(a[index+1:]
))并通过添加这两个副本来创建一个新的列表对象。然后将其重新分配给列表变量(a
)。旧的列表对象因此被取消引用,因此被垃圾回收(前提是原始列表对象不被除a之外的任何变量引用)。这使得这个方法非常低效,而且它也会产生不希望的副作用(特别是当其他变量指向原始列表对象时,该列表对象仍然未被修改)。
感谢@MarkDickinson指出这一点。。。
This堆栈溢出答案解释了切片的概念。
还要注意,这只适用于正指数。
在与对象一起使用时,必须定义
__getitem__
方法,更重要的是,必须定义__add__
方法以返回包含两个操作数中的项的对象。本质上,这适用于类定义如下的任何对象:
这与定义
__getitem__
和__add__
方法的list
一起工作。三种方法在效率方面的比较:
假设以下是预定义的:
方法:
目前为止最有效的方法。它可以工作,所有定义
__del__
方法的对象都可以工作。拆卸步骤如下:
代码:
拆卸:
pop
方法:它比del方法效率低,并且在需要获取已删除项时使用。
代码:
拆卸:
切片和添加方法。
效率最低。
代码:
拆卸:
注意:在所有三个反汇编中,忽略最后两行,这两行基本上是
return None
。前两行还加载全局值a
和index
。相关问题 更多 >
编程相关推荐