为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2019-06-29 14:49:40
如何按索引从列表中删除元素?如何在Python中按索引从列表中删除元素?我找到了list.remove方法,但是假设我想移除最后一个元素,我如何做到这一点?似乎默认的删除搜索列表,但我不想执行任何搜索。
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

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

这里是本教程中的部分。


查看完整回答
反对 回复 2019-06-29
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

你可能想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']


查看完整回答
反对 回复 2019-06-29
?
手掌心

TA贡献1942条经验 获得超3个赞

就像其他人提到的,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:])并通过添加这两种方法创建一个新的List对象。然后将其重新分配到List变量(a)。因此,旧的List对象被取消引用,并因此被垃圾收集(前提是原始List对象不被除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 )

这和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_VALUENone

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_VALUENone

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


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 2443 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信