如何通过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 ]
  注意:请注意,这种方法不会像pop和del一样修改就地列表。  它会创建两个副本(一个从开始到索引但没有它( 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也前两行加载全局值a和index 。 
上一篇: How to remove an element from a list by index in Python?
