首页 > Python > 如何按索引从列表中删除元素?

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

上一篇 下一篇

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

我找到了,但这会慢慢地按值扫描列表以查找项目。list.remove()

分割线

网友回答:

像其他人提到的一样,pop 和 del 是删除给定索引项的有效方法。然而,只是为了完成(因为在 Python 中可以通过多种方式完成同样的事情):

使用切片(这不会就地从原始列表中删除项目):

(在使用 Python 列表时,这也是效率最低的方法,但在处理不支持 pop 但确实定义了 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]

注意:请注意,此方法不会像 和 那样修改列表。相反,它创建列表的两个副本(一个从开始到索引,但没有索引(),另一个在索引之后直到最后一个元素()),并通过添加两者来创建新的列表对象。然后将其重新分配给列表变量 ()。因此,旧的列表对象被取消引用,因此被垃圾回收(前提是原始列表对象未被 a 以外的任何变量引用)。popdela[:index]a[index+1:]a

这使得此方法效率非常低,并且还会产生不良的副作用(特别是当其他变量指向未修改的原始列表对象时)。

感谢@MarkDickinson指出这一点…

这个堆栈溢出答案解释了切片的概念。

另请注意,这仅适用于正指数。

与对象一起使用时,必须已定义该方法,更重要的是,必须已定义__add__方法以返回包含来自两个操作数的项目的对象。__getitem__

从本质上讲,这适用于类定义如下的任何对象:

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

流行方法:

它的效率低于 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 Noneaindex

分割线

网友回答:

使用并指定要删除的元素的索引: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']

模板简介:该模板名称为【如何按索引从列表中删除元素?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 403次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-17
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
单页式简历模板 响应式 微信素材 微信文章 html5 微信公众平台 企业网站 自适应 微信图片 微信模板
您可能会喜欢的其他模板