如何在Python中按索引从列表中删除元素?
我找到了list.remove
方法,但是说我要删除最后一个元素,该怎么做?似乎默认的remove搜索列表,但是我不希望执行任何搜索。
O(n)
索引访问a[i]
(由于链接列表)。注意:基于数组的实现提供O(1)
索引访问。
如何在Python中按索引从列表中删除元素?
我找到了list.remove
方法,但是说我要删除最后一个元素,该怎么做?似乎默认的remove搜索列表,但是我不希望执行任何搜索。
O(n)
索引访问a[i]
(由于链接列表)。注意:基于数组的实现提供O(1)
索引访问。
Answers:
使用del
并指定要删除的元素的索引:
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]
还支持切片:
>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]
这是教程中的部分。
PyList_GetItem()
本质上如何返回((PyListObject *)op) -> ob_item[i];
- i
数组的第一个元素。
您可能想要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()
它本身就非常明显,同时由于冗余而pop(-1)
可能会造成混乱。
pop
在大多数编程语言中,@ zx1986 a 通常会删除最后一项,就像在Python中一样。因此,无论您指定-1还是不指定什么都相同。
pop()
返回它删除的任何元素。
像其他提到的一样,pop和del是删除给定索引项的有效方法。只是为了完成(因为可以通过Python中的许多方法来完成同一件事):
使用切片(这并不能代替从原始列表中删除项目):
(这也是使用Python列表时效率最低的方法,但是在使用不支持pop但却定义了a的用户定义对象时,这可能会很有用(但无效,我重申__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 )
这与list
定义__getitem__
和__add__
方法一起使用。
三种方式的效率比较:
假设以下是预定义的:
a = range(10)
index = 3
该del object[index]
方法:
迄今为止最有效的方法。所有定义__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
slice和add方法。
效率最低。
码:
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
注意:在所有三个反汇编中,忽略最后两行,基本上是return None
。同样,前两行正在加载全局值a
和index
。
a = a[:index] + a[index+1 :]
,当涉及大量列表时,-trick是最省钱的。所有其他方法最终陷入僵局。因此,非常感谢
通常,我使用以下方法:
>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]
通过索引从列表中删除元素的另一种方法。
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]指向索引中的元素 x
到y-1
。当我们将列表的该部分声明为空列表([]
)时,这些元素将被删除。
您可以只搜索要删除的项目。真的很简单。例:
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)
输出:acde
使用以下代码从列表中删除元素:
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]
如前所述,最佳实践是del(); 或pop()如果您需要知道该值。
另一种解决方案是仅重新堆叠所需的那些元素:
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()/列表理解。
思考
del()
?对于该函数,您将列表作为该函数的第一个参数,然后提供索引,还是先提供索引,再提供列表?它返回不带项目的list参数,还是就地删除。我知道该del
语句,但不知道具有相同名称的函数。
听起来好像您不是在使用列表列表,所以我将简短说明。您要使用pop,因为它将删除元素而不是列表元素,因此应使用del。要调用python中的最后一个元素,它是“ -1”
>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']
pop()
并del
都在提供的索引处删除元素,而与该元素本身是否为列表无关。a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
使用“ del”功能:
del listName[-N]
例如,如果要删除最后3个项目,则代码应为:
del listName[-3:]
例如,如果要删除最后8个项目,则代码应为:
del listName[-8:]
已经提到了如何从列表中删除单个元素以及不同方法具有哪些优点。但是请注意,删除多个元素可能会导致错误:
>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in indices:
... del l[i]
...
>>> l
[0, 1, 2, 4, 5, 6, 7, 9]
原始列表的元素3和8(不是3和7)已被删除(因为列表在循环中被缩短了),这可能不是本意。如果要安全删除多个索引,则应首先删除索引最高的元素,例如:
>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in sorted(indices, reverse=True):
... del l[i]
...
>>> l
[0, 1, 2, 4, 5, 6, 8, 9]
或者,如果应删除多个索引:
print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])
然后当然也可以这样做:
print([v for i,v in enumerate(your_list) if i != unwanted_index])
您可以使用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]
>>>
O(n)
及时运行的原因。deque()
提供两端有效的操作,但在中间不提供O(1)插入/查找/删除。