列表中的del,remove和pop之间的区别

时间:2012-07-17 10:21:41

标签: python list

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

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

12 个答案:

答案 0 :(得分:948)

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

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

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

>>> a = [3, 2, 2, 1]
>>> del a[1]
>>> a
[3, 2, 1]

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

答案 1 :(得分:126)

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

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

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

答案 2 :(得分:63)

由于没有其他人提及它,请注意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]

答案 3 :(得分:38)

其他人已经回答得很好。这个来自我的结尾:))

remove vs pop vs del

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

答案 4 :(得分:13)

pop - 获取索引并返回值

remove - 取值,删除第一次出现,不返回任何内容

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

答案 5 :(得分:8)

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

在所有这些方法中,reverse和pop为后缀,而删除为前缀

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

希望这可以澄清混乱情况。

答案 6 :(得分:2)

这是详细的答案。

del可以用于任何类对象,而pop和remove可以绑定到特定的类。

对于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 3
4
>>> 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]

希望这个答案很有帮助。

答案 7 :(得分: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 - 有和没有索引。 如果我不想返回值: 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.

答案 8 :(得分:0)

pop和delete两者都使用索引删除元素,如上面的注释中所述。关键的区别在于它们的时间复杂性。没有索引的pop()的时间复杂度是O(1),但删除最后一个元素的情况并不相同。

如果你的用例总是删除最后一个元素,那么总是更喜欢使用pop()而不是delete()。有关时间复杂性的更多说明,请参阅this component

答案 9 :(得分:0)

列表上的remove操作具有要删除的值。它搜索列表以查找具有该值的项目,然后删除找到的第一个匹配项目。如果没有匹配的项目,则会引发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语句可用于删除整个列表。如果您有一个特定的列表项作为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

答案 10 :(得分:-1)

删除基本上对value有效。 删除并弹出索引上的工作

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

Example:

答案 11 :(得分:-3)

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

n = [1, 3, 5]

n.remove(n[1])

n然后将参考[1,5]