删除,删除和弹出列表之间的区别


Answers:


1326

是的,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

14
@jxramos:del不是语法保留,不是。语法不变,就像returnor ifwhile
彼得斯

5
值得一提的是,用户在迭代列表时要小心,并在迭代时在列表上同时使用这些功能。
hamaney

16
这个del例子有些误导。究竟删除了哪个元素?第二还是第三?您应该使用过[9, 8, 7, 6]del a[1]以及[9, 7, 6]
gromit190 '19

2
@ rite2hhh它测试是否相等。平等测试首先将身份测试作为一种优化
马丁·彼得斯

1
@ rite2hhh:表达式引用中包含了值相等性。
马丁·彼得斯

182

用于del按索引删除元素,pop()如果需要返回值,则按索引remove()删除元素,以及按值删除元素。后者需要搜索列表,并在列表中ValueError没有出现此类值时引发。

in元素列表中删除索引时,这些方法的计算复杂度为

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

1
pop是否需要搜索列表
sachin irukula 2012年

30
+1用于复杂性分解。说明了当元素位于列表的末尾时delete和pop如何保持不变。
2014年

2
记住,伙计们……任何基于索引的镜头都是一次O(n-1)...如果必须进行查找(按值),它将遍历集合直到找到元素。
Pepito Fernandez

2
@PepitoFernandez在Python中按索引查找的列表是O(1)。(Python中的列表类似于C ++中的向量。)
Sven Marnach

3
@PlasmaBinturong您应该使用您认为更具可读性的内容,除非您拥有证明性能至关重要的数据。如果有的话,您需要衡量在特定情况下更快的解决方案。我的猜测还del稍快一些,但是由于另一个原因:__delitem__在C中实现的类型的查找按索引而不是按名称进行,而pop需要遵循整个描述符协议进行查找。函数本身的执行应花费相同的时间。两者都返回一个指针–一个指向已删除的对象,另一个指向None
Sven Marnach

91

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

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

IndexError如果索引不在列表中,这还可以避免使用an :

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

55

已经被其他人很好地回答了。这是我的结尾:)

删除vs流行vs del

显然,pop是唯一返回值remove的对象,并且是唯一搜索对象的对象,同时del将自身限制为简单的删除。


2
谢谢!注意事项:在python中,由于实现列表的方式(实际上是数组...!),“前进至该节点位置”为O(1)
ntg

19

这里有很多最佳的解释,但我会尽力简化一下。

在所有这些方法中,reverse和pop是后缀,而delete是prefix

remove():用于删除元素的第一次出现

remove(i) =>第一次出现i值

>>> 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]

pop():如果满足以下条件,则用于删除元素:

未指定

pop() =>从列表末尾

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

指定的

pop(index) =>索引

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

警告:危险方法提前

delete():它是一个前缀方法。

注意同一方法的两种不同语法:[]和()。它具有以下功能:

1.删​​除索引

del a[index] =>用于删除索引及其关联值,就像pop。

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2.删除[index 1:index N]范围内的值

del a[0:3] =>范围内的多个值

>>>del a[0:3]
>>>a
[6, 5]

3.最后但不是列表,一次删除整个列表

del (a) =>如上所述。

>>>del (a)
>>>a

希望这可以澄清混淆。


18

pop-获取索引并返回值

remove-取值,删除第一个匹配项,不返回任何内容

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


2

针对特定动作定义了对不同数据结构的任何操作/功能。在您的情况下,即删除一个元素,然后删除,弹出和删除。(如果考虑设置,则添加另一个操作-丢弃)添加时其他令人困惑的情况。插入/追加。为了演示,让我们实现双端队列。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()

操作必须返回一些东西。因此,弹出-有和没有索引。如果我不想返回该值:del self.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

返回[1,3,5,7]

让我们考虑一下集合的情况。

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.

1

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

如果您的用例始终是删除最后一个元素,则始终首选使用pop()而不是delete()。有关时间复杂度的更多说明,请参阅https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt


2
这在很多方面都是错误的。没有这样的方法delete。区别在于pop返回值,并且del适用于切片。在可行的情况下popdel具有完全相同的计算复杂度(并且按常数项稍微快一些)。
abarnert

1

列表上的删除操作具有要删除的值。它搜索列表以查找具有该值的项目,然后删除找到的第一个匹配项目。如果没有匹配的项目,将引发ValueError,这是一个错误。

>>> 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的参数(例如,listname [7]专门引用列表中的第8个项),则将其删除。甚至有可能从列表中删除“片段”。如果索引超出范围,则会引发IndexError,这是一个错误。

>>> 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

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

>>> 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


-1

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

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

例:


3
尽管我们感谢您的回答,但如果它在其他答案的基础上提供附加价值,那会更好。在这种情况下,您的答案无法提供额外的价值,因为其他用户覆盖了您包含在答案中的所有内容。作为第二个问题,当您将文本粘贴为文本时,请勿将文本作为图片包含在内。如果先前的答案对您有所帮助,则应投票赞成
大卫·巴克

-3

您也可以使用remove来删除索引值。

n = [1, 3, 5]

n.remove(n[1])

n然后将指代[1,5]


43
n = [5, 3, 5]然后尝试n.remove(n[2])
abarnert 2014年

@abarnert您的用例与以下情况n = [5,3,5]同步,然后与n.remove(5)同步。这两个都从列表中删除了第一个遇到的元素。
Akhil Ghatiki

@AkhilGhatiki n.remove(n[2])删除n[0],而不是n[2]。因此,这不仅仅是无缘无故的线性时间(当N = 3时可能不是什么大问题),这也是错误的(无论N是什么大问题)
abarnert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.