How do I remove an element from a list by index in Python?
如何在Python中按索引从列表中删除元素?
我找到了
使用
1 2 3 4 | >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del a[-1] >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8] |
还支持切片:
1 2 3 | >>> del a[2:4] >>> a [0, 1, 4, 5, 6, 7, 8, 9] |
这是本教程的一节。
您可能需要
1 2 3 4 | a = ['a', 'b', 'c', 'd'] a.pop(1) # now a is ['a', 'c', 'd'] |
默认情况下,没有任何参数的
1 2 3 4 | a = ['a', 'b', 'c', 'd'] a.pop() # now a is ['a', 'b', 'c'] |
和其他人提到的一样,pop和del是删除给定索引项的有效方法。然而,仅仅是为了完成(因为同样的事情可以通过许多方法在Python中完成):
使用切片(这不会就地从原始列表中删除项目):
(在使用python list时,这也是最不有效的方法,但在使用不支持pop但定义
1 2 3 4 5 | >>> 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] |
注:请注意,此方法不修改现有列表,如
这使得这个方法非常低效,而且它也会产生不良的副作用(特别是当其他变量指向原始列表对象时,这些对象仍然是未修改的)。
感谢@markdickinson指出这一点…
这个堆栈溢出答案解释了切片的概念。
还要注意,这只适用于正指数。
在与对象一起使用时,必须定义
本质上,这适用于类定义如下的任何对象:
1 2 3 4 5 6 7 8 9 | 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 ) |
这与定义
三种方法在效率方面的比较:
假设预先定义了以下内容:
1 2 | a = range(10) index = 3 |
到目前为止,这是最有效的方法。它适用于定义
拆卸如下:
代码:
1 2 3 4 | def del_method(): global a global index del a[index] |
Disassembly:
1 2 3 4 5 6 | 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 |
它比del方法效率低,在需要获取已删除项时使用。
代码:
1 2 3 4 | def pop_method(): global a global index a.pop(index) |
Disassembly:
1 2 3 4 5 6 7 | 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 |
切片和添加方法。
效率最低的。
代码:
1 2 3 4 | def slice_method(): global a global index a = a[:index] + a[index+1:] |
Disassembly:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
注:在三个拆卸中,忽略最后两行,基本上是
1 2 3 4 5 | >>> x = [1, 2, 3, 4] >>> p = x.pop(1) >>> p 2 |
这取决于你想做什么。
如果要返回删除的元素,请使用
1 2 3 4 5 | >>> l = [1, 2, 3, 4, 5] >>> l.pop(2) 3 >>> l [1, 2, 4, 5] |
但是,如果只想删除一个元素,请使用
1 2 3 4 | >>> l = [1, 2, 3, 4, 5] >>> del l[2] >>> l [1, 2, 4, 5] |
另外,
通常,我使用以下方法:
1 2 3 4 5 | >>> myList = [10,20,30,40,50] >>> rmovIndxNo = 3 >>> del myList[rmovIndxNo] >>> myList [10, 20, 30, 50] |
另一种方法是按索引从列表中删除元素。
1 2 3 4 5 6 7 8 9 | 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] |
a[x:y]指向从索引
您可以搜索要删除的项目。这真的很简单。例子:
1 2 3 | letters = ["a","b","c","d","e"] letters.remove(letters[1]) print(*letters) # Used with a * to make it unpack you don't have to (Python 3.x or newer) |
输出:一个C D
使用以下代码从列表中删除元素:
1 2 3 4 5 | list = [1, 2, 3, 4] list.remove(1) print(list) output = [2, 3, 4] |
如果要从列表中删除索引元素数据,请使用:
1 2 3 4 | list = [1, 2, 3, 4] list.remove(list[2]) print(list) output : [1, 2, 4] |
如前所述,如果需要知道值,最佳实践是del();或pop()。
另一种解决方案是只重新堆叠需要的元素:
1 2 3 4 5 6 7 8 9 10 11 12 | 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'] |
埃塔:嗯…不会对负索引值起作用,会思考和更新
我想
1 | if index_<0:index_=len(list_)+index_ |
会修补它…但突然间,这个想法显得很脆弱。不过,有趣的思维实验。对于append()/list的理解,似乎应该有一种"正确"的方法来实现这一点。
沉思
这听起来不像是你在处理一个列表,所以我会保持简短。您希望使用pop,因为它将删除元素而不是列表中的元素,所以应该使用del。调用python中的最后一个元素是"-1"
1 2 3 4 5 | >>> test = ['item1', 'item2'] >>> test.pop(-1) 'item2' >>> test ['item1'] |
L-值列表;我们必须从inds2rem列表中删除索引。
1 2 3 4 5 6 | 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] |
如果要删除列表中的特定位置元素,如2th、3th和7th。你不能用
1 2 3 | del my_list[2] del my_list[3] del my_list[7] |
因为删除第二个元素后,删除的第三个元素实际上是原始列表中的第四个元素。您可以过滤原始列表中的2th、3th和7th元素并得到一个新的列表,如下所示:
1 | new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]] |
使用"del"功能:
1 | del listName[-N] |
例如,如果要删除最后3个项,则代码应为:
1 | del listName[-3:] |
例如,如果要删除最后8项,则代码应为:
1 | del listName[-8:] |
可以使用del或pop,但我更喜欢del,因为您可以指定索引和切片,从而让用户对数据有更多的控制权。
例如,从显示的列表开始,可以删除其最后一个元素,其中
1 2 3 4 5 6 7 8 | >>> l = [1,2,3,4,5] >>> del l[-1:] >>> l [1, 2, 3, 4] >>> l.pop(-1) 4 >>> l [1, 2, 3] |
或者如果应删除多个索引:
1 | print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes]) |
当然,也可以这样做:
1 | print([v for i,v in enumerate(your_list) if i != unwanted_index]) |
可以使用del或pop根据索引从列表中删除元素。pop将打印它从列表中删除的成员,而list将删除该成员而不打印它。
1 2 3 4 5 6 7 8 9 | >>> a=[1,2,3,4,5] >>> del a[1] >>> a [1, 3, 4, 5] >>> a.pop(1) 3 >>> a [1, 4, 5] >>> |
但不要将pop()与loop一起使用。它将导致错误。请使用pop()而不使用loop。
您可以简单地使用python的
1 2 3 4 5 6 | 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] |