2012-07-17 118 views

回答

464

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

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

pop删除项目:

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

del在特定索引中删除该项目在一个特定的索引并返回它。

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

我认为'del'是一个像'print'一样的Python 2语法保留,但它仍然可以在python 3中工作。 – jxramos 2017-09-01 20:12:33

+3

@jxramos:'del'不是语法保留,不。语法不变,就像'return'或'if'或'while'一样。 – 2017-09-01 20:57:08

72

使用del通过索引中删除一个元素,pop()通过索引如果你需要返回值将其删除,并remove()被删除元素值。后者需要搜索列表,并且如果列表中没有这样的值,则引发ValueError

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

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

是否需要搜索列表 – 2012-07-17 10:31:01

+0

@kratos:不,请参阅我的编辑。 – 2012-07-17 10:34:34

+5

+1复杂度分解。说明当元素位于列表的末尾时,删除和弹出如何保持不变。 – 2014-11-06 05:56:54

-2

您还可以使用删除,以消除指数的值也是如此。然后

n = [1, 3, 5] 

n.remove(n[1]) 

N将参考[1,5]

+32

尝试'n = [5,3,5]',然后'n.remove(n [2])'。 – abarnert 2014-02-18 03:46:58

8

弹出:取索引&返回值

删除:取值,除去第一次出现,并且没有返回

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

4

虽然pop和delete都采用索引来删除元素,如评论。一个关键的区别是它们的时间复杂性。没有索引的pop()的时间复杂度是O(1),但删除最后一个元素的情况并非如此。

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

21

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

操作必须回报什么。所以,流行 - 有和没有索引。 如果我不想返回值: 德尔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. 
14

已经很好地回答了。这一个从我结束:)

remove vs pop vs del

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

+2

我喜欢这个图。 – 2017-11-28 17:45:19

+1

yh很好的例证 – Kodejuice 2017-12-03 15:34:23