删除,删除和popup列表之间的区别

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

上述三种从列表中删除元素的方法是否有区别?

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

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

删除一个特定的索引:

 >>> a = [3, 2, 2, 1] >>> del a[1] [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 

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

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

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

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

stream行:需要索引并返回价值

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

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

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

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

已经很好的回答了。 这从我的结束:)

删除vs流行vs del

在不同的数据结构上的任何操作/function都是为特定的操作而定义 在你的情况下,即删除一个元素,删除,popup和删除。 (如果考虑套,添加另一个操作 – 丢弃)其他混淆的情况是添加。 插入/追加。 为了示范,让我们执行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() 

操作必须返回一些东西。 所以,stream行 – 有和没有索引。 如果我不想返回值: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. 

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

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

然后n会参考[1,5]