如何通过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 ]
注意:请注意,这个方法不会像pop
和del
一样修改列表。 它取而代之的是从列表的两个副本(一个从开始直到索引但没有它( 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
前两行加载全局值a
和index
。
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]