如何通过Python中的索引从列表中删除元素?

如何通过Python中的索引从列表中删除元素?

我find了list.remove方法,但是说我想删除最后一个元素,我该怎么做? 看起来像默认删除search列表,但我不希望执行任何search。

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

像其他人提到的stream行和删除是有效的方法来删除一个给定的索引项目。 然而,只是为了完成(因为在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:] )),并创build一个新的列表对象加上两者。 然后重新分配给列表variables( a )。 旧列表对象因此被解引用,因此垃圾收集(提供原始列表对象不被除了a以外的任何variables引用)

这使得这种方法非常低效,也会产生不良的副作用(特别是当其他variables指向原始列表对象时,它仍然未被修改)

感谢@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

pop也是有用的,从列表中删除和保留一个项目。 del在哪里实际上垃圾的项目。

 >>> x = [1, 2, 3, 4] >>> p = x.pop(1) >>> p 2 

一般来说,我使用下面的方法:

 >>> myList = [10,20,30,40,50] >>> rmovIndxNo = 3 >>> del myList[rmovIndxNo] >>> myList [10, 20, 30, 50] 

你可以search你想要删除的项目。 真的很简单。 例:

  letters = ["a", "b", "c", "d", "e"] numbers.remove(numbers[1]) print(*letters) # used a * to make it unpack you don't have to 

输出:acde

如前所述,最佳实践是del(); 或者popup()如果你需要知道的价值。

另一种解决方法是只重新堆叠你想要的元素:

  a = ['a', 'b', 'c', 'd'] def remove_element(list_,index_): clipboard = [] for i in range(len(list_)): if i is not index_: clipboard.append(list_[i]) return clipboard print(remove_element(a,2)) >> ['a', 'b', 'd'] 

eta:嗯…不会在负指数值上工作,会思考和更新

我想

 if index_<0:index_=len(list_)+index_ 

会修补它…但突然间这个想法似乎非常脆弱。 有趣的思想实验虽然。 似乎应该有一个“正确”的方式来做到这一点与append()/列表理解。

琢磨

这听起来不像你正在处理一个列表清单,所以我会保持这个简短。 你想使用popup,因为它会删除元素而不是列表的元素,你应该使用del。 要调用python中的最后一个元素,它是“-1”

 >>> test = ['item1', 'item2'] >>> test.pop(-1) 'item2' >>> test ['item1'] 

使用下面的代码从列表中删除元素:

 list = [1, 2, 3, 4] list.remove(1) print(list) output = [2, 3, 4] 

如果要从列表中删除索引元素数据,请使用:

 list = [1, 2, 3, 4] list.remove(list[2]) print(list) output : [1, 2, 4] 

这取决于你想要做什么。

如果你想返回你删除的元素,使用pop()

 >>> l = [1, 2, 3, 4, 5] >>> l.pop(2) 3 >>> l [1, 2, 4, 5] 

但是,如果您只想删除一个元素,请使用del

 >>> l = [1, 2, 3, 4, 5] >>> del l[2] >>> l [1, 2, 4, 5] 

另外, del允许你使用切片(例如del[2:] )。

使用“del”function:

 del listName[-N] 

例如,如果你想删除最后3个项目,你的代码应该是:

 del listName[-3:] 

例如,如果你想删除最后的8个项目,你的代码应该是:

 del listName[-8:] 

您可以使用del或pop从基于索引的列表中删除元素。 Pop将打印它从列表中删除的成员,而列表删除该成员而不打印它。

 >>> a=[1,2,3,4,5] >>> del a[1] >>> a [1, 3, 4, 5] >>> a.pop(1) 3 >>> a [1, 4, 5] >>> 

你可以简单地使用python的remove函数,就像这样:

 v=[1,2,3,4,5,6] v.remove(v[4]) #I'm removing the number with index 4 of my array print(v) #If you want verify the process #it gave me this: #[1,2,3,4,6] 

可以使用del或pop,但我更喜欢del,因为您可以指定索引和切片,从而使用户可以更好地控制数据。

例如,从显示的列表开始,可以用del去掉它的最后一个元素作为切片,然后可以使用pop从结果中删除最后一个元素。

 >>> l = [1,2,3,4,5] >>> del l[-1:] >>> l [1, 2, 3, 4] >>> l.pop(-1) 4 >>> l [1, 2, 3] 

l – 值列表; 我们必须从inds2rem列表中删除索引。

 l = range(20) inds2rem = [2,5,1,7] map(lambda x: l.pop(x), sorted(inds2rem, key = lambda x:-x)) >>> l [0, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 

另一种通过索引从列表中删除元素的方法。

 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # remove the element at index 3 a[3:4] = [] # a is now [0, 1, 2, 4, 5, 6, 7, 8, 9] # remove the elements from index 3 to index 6 a[3:7] = [] # a is now [0, 1, 2, 7, 8, 9]