如何通过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 ]

注意:请注意,这种方法不会像popdel一样修改就地列表。 它会创建两个副本(一个从开始到索引但没有它( 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也前两行加载全局值aindex

链接地址: http://www.djcxy.com/p/3125.html

上一篇: How to remove an element from a list by index in Python?

下一篇: How to format a JavaScript date