列表中del、删除和pop的区别

这三种从列表中删除元素的方法有什么区别吗?

>>> a = [1, 2, 3]>>> a.remove(2)>>> a[1, 3]
>>> a = [1, 2, 3]>>> del a[1]>>> a[1, 3]
>>> a = [1, 2, 3]>>> a.pop(1)2>>> a[1, 3]
1996167 次浏览

从列表中删除元素的三种不同方法的效果:

remove删除匹配第一,而不是特定索引:

>>> a = [0, 2, 3, 2]>>> a.remove(2)>>> a[0, 3, 2]

del删除特定索引处的项目:

>>> a = [9, 8, 7, 6]>>> del a[1]>>> a[9, 7, 6]

pop删除特定索引处的项并返回它。

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

它们的错误模式也不同:

>>> a = [4, 5, 6]>>> a.remove(7)Traceback (most recent call last):File "<stdin>", line 1, in <module>ValueError: list.remove(x): x not in list>>> del a[7]Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list assignment index out of range>>> a.pop(7)Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: pop index out of range

使用del按索引删除元素,如果需要返回值,使用pop()按索引删除它,使用remove()按值删除元素。最后一个需要搜索列表,如果列表中没有这样的值,则引发ValueError

当从n元素列表中删除索引i时,这些方法的计算复杂性是

del     O(n - i)pop     O(n - i)remove  O(n)

您还可以使用删除按索引删除值。

n = [1, 3, 5]
n.remove(n[1])

然后n会引用[1,5]

流行

获取索引(给定时,否则取最后一个),删除该索引处的值,并返回值

删除

删除

获取索引,删除该索引处的值,并且不返回任何内容

如上所述,pop和删除都采用索引来删除元素。一个关键的区别是它们的时间复杂度。没有索引的pop()的时间复杂度是O(1),但删除最后一个元素的情况不同。

如果您的用例总是删除最后一个元素,那么使用pop()总是比delete()更好。有关时间复杂度的更多解释,您可以参考https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

由于没有其他人提到它,请注意del(与pop不同)允许由于列表切片而删除一系列索引:

>>> lst = [3, 2, 2, 1]>>> del lst[1:]>>> lst[3]

如果索引不在列表中,这也允许避免IndexError

>>> lst = [3, 2, 2, 1]>>> del lst[10:]>>> lst[3, 2, 2, 1]

不同数据结构上的任何操作/函数都是为特定操作定义的。在您的情况下,即删除元素、删除、弹出和删除。(如果您考虑集合,请添加另一个操作-丢弃)其他令人困惑的情况是在添加时。插入/追加。对于演示,让我们实现deque。deque是一种混合线性数据结构,您可以在其中添加元素/从两端删除元素。(后端和前端)

class Deque(object):
def __init__(self):
self.items=[]
def addFront(self,item):
return self.items.insert(0,item)def addRear(self,item):
return self.items.append(item)def deleteFront(self):
return self.items.pop(0)def deleteRear(self):return self.items.pop()def returnAll(self):
return self.items[:]

在这里,看看操作:

def deleteFront(self):
return self.items.pop(0)def deleteRear(self):return self.items.pop()

操作必须返回一些东西。所以,pop-有和没有索引。如果我不想返回值:delself.items[0]

按值删除而不是索引:

  • 删除:

    list_ez=[1,2,3,4,5,6,7,8]for i in list_ez:if i%2==0:list_ez.remove(i)print list_ez

Returns [1,3,5,7]

let us consider the case of sets.

set_ez=set_ez=set(range(10))
set_ez.remove(11)
# Gives Key Value Error.##KeyError: 11
set_ez.discard(11)
# Does Not return any errors.

其他人已经回答得很好了。这是我这边的:)

删除vs删除vs删除

显然,pop是唯一返回值的,remove是唯一搜索对象的,而del将自己限制为简单的删除。

列表上的删除操作被赋予一个要删除的值。它搜索列表以查找具有该值的项并删除它找到的第一个匹配项。如果没有匹配项,则为错误,引发属性值错误

>>> x = [1, 0, 0, 0, 3, 4, 5]>>> x.remove(4)>>> x[1, 0, 0, 0, 3, 5]>>> del x[7]Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>del x[7]IndexError: list assignment index out of range

del语句可用于删除整个列表。如果您有一个特定的列表项作为del的参数(例如listname[7]专门引用列表中的第8项),它会删除该项。甚至可以从列表中删除一个“切片”。如果索引超出范围,引发错误码,这是一个错误。

>>> x = [1, 2, 3, 4]>>> del x[3]>>> x[1, 2, 3]>>> del x[4]Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>del x[4]IndexError: list assignment index out of range

流行的通常用法是在将列表用作堆栈时从列表中删除最后一项。与del不同,pop返回它从列表中弹出的值。您可以选择为pop提供索引值,并从列表末尾以外的位置弹出(例如listname.pop(0)将从列表中删除第一项并返回第一项作为其结果)。您可以使用它使列表的行为像队列一样,但也有可用的库例程可以提供比pop(0)更好的队列操作性能。如果有索引超出范围,则会引发错误码,这是一个错误。

>>> x = [1, 2, 3]>>> x.pop(2)3>>> x[1, 2]>>> x.pop(4)Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>x.pop(4)IndexError: pop index out of range

查看collections.deque了解更多详情。

这里有很多很好的解释,但我会尽力简化更多。

在所有这些方法中,removepop后缀,而删除是前缀

#0:用于删除元素的第一个匹配项。
remove(n)=>列表中n的第一次出现。

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]>>> a.remove(2)   # where i = 2>>> a[0, 3, 2, 1, 4, 6, 5, 7]

#0:用于删除元素…

  • 如果未指定索引:
    pop()=>从列表末尾
>>> a.pop()>>> a[0, 3, 2, 1, 4, 6, 5]
  • 如果指定了索引:
    pop(index)=>索引
>>> a.pop(2)>>> a[0, 3, 1, 4, 6, 5]

警告:前方有危险

#0:这是一个前缀方法。

关注同一方法的两种不同语法:with[]和not。它具有以下功能:

  • 删除索引
    del a[index]=>用于按索引及其关联值删除,就像pop一样。
>>> del a[1]>>> a[0, 1, 4, 6, 5]
  • 删除范围[index_1:index_N]中的值:
    del a[0:3]=>范围内的多个值。
>>> del a[0:3]>>> a[6, 5]
  • 最后但并非最不重要的是,一次性删除整个列表。
    del (a)=>如上所述。
>>> del (a)>>> aTraceback (most recent call last):File "<stdin>", line 1, in <module>NameError: name 'a' is not defined

希望这能澄清混乱。

删除基本上对值起作用。删除和弹出索引上的工作

Remove基本上删除第一个匹配值。删除从特定索引中删除项目Pop基本上接受一个索引并返回该索引处的值。下次打印列表时,该值不会出现。

示例:

这里有一个详细的答案。

del可以用于任何类对象,而pop和删除并限制到特定的类。

对于del

这里有一些例子

>>> a = 5>>> b = "this is string">>> c = 1.432>>> d = myClass()
>>> del c>>> del a, b, d   # we can use comma separated objects

我们可以在用户创建的类中覆盖__del__方法。

特定用途列表

>>> a = [1, 4, 2, 4, 12, 3, 0]>>> del a[4]>>> a[1, 4, 2, 4, 3, 0]
>>> del a[1: 3]   # we can also use slicing for deleting range of indices>>> a[1, 4, 3, 0]

对于pop

pop将索引作为参数并删除该索引处的元素

del不同,pop在列表对象上调用时返回该索引处的值

>>> a = [1, 5, 3, 4, 7, 8]>>> a.pop(3)  # Will return the value at index 34>>> a[1, 5, 3, 7, 8]

对于remove

删除获取参数值并从列表中删除该值。

如果存在多个值,将删除第一个匹配项

Note:如果该值不存在,将抛出ValueError

>>> a = [1, 5, 3, 4, 2, 7, 5]>>> a.remove(5)  # removes first occurence of 5>>> a[1, 3, 4, 2, 7, 5]>>> a.remove(5)>>> a[1, 3, 4, 2, 7]

希望这个答案有帮助。

删除(),del和pop()很慢…“无”呢?

这么多回复,也没看到有谁在聊绩效,所以给大家一个绩效小贴士:

删除后删除()、del和pop()将所有剩余值向左移动…

1, 2, 3, 4, 5, 6remove(3)1, 2, <- 4, 5, 6

…使处理缓慢!

仅将所需值更改为null以进一步处理删除可以为您的程序增加很多速度,特别是在处理大量数据时:

my_array[2] = None

当然,设置空值与删除它是不同的,但如果你想了解更多关于删除,思考这个操作的性能似乎也很有趣。

del、pop和删除在执行速度方面的区别:

删除任何中间项时:

import timeitprint(timeit.timeit("a=[1,2,3,4,5]\ndel a[3]",number=100000))print(timeit.timeit("a=[1,2,3,4,5]\na.pop(3)",number=100000))print(timeit.timeit("a=[1,2,3,4,5]\na.remove(3)",number=100000))

del vspop vsremove

0.0193876579869538550.025062134023755790.033232167130336165

del()似乎比其他两个快得多,而删除()是最慢的。

删除最后一项时:

print(timeit.timeit("a=[1,2,3,4,5]\ndel a[-1]",number=100000))print(timeit.timeit("a=[1,2,3,4,5]\na.pop()",number=100000))print(timeit.timeit("a=[1,2,3,4,5]\na.remove(5)",number=100000))

del vspop vsremove

0.019745514029636980.0203335848636925220.03434014297090471

del()和pop()删除最后一项的时间相似。