Difference between del, remove and pop on lists
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> 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] >>> |
从列表中删除元素的上述三种方法有什么不同吗?
是的,
1 2 3 4 | >>> a = [0, 2, 3, 2] >>> a.remove(2) >>> a [0, 3, 2] |
1 2 3 4 | >>> a = [3, 2, 2, 1] >>> del a[1] >>> a [3, 2, 1] |
1 2 3 4 5 | >>> a = [4, 3, 5] >>> a.pop(1) 3 >>> a [4, 5] |
它们的错误模式也不同:
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> 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 2 3 | del O(n - i) pop O(n - i) remove O(n) |
由于没有其他人提到它,请注意,由于列表切片,
1 2 3 4 | >>> lst = [3, 2, 2, 1] >>> del lst[1:] >>> lst [3] |
如果索引不在列表中,这也允许避免使用
1 2 3 4 | >>> lst = [3, 2, 2, 1] >>> del lst[10:] >>> lst [3, 2, 2, 1] |
已经被其他人很好地回答了。我这边的这个:)
显然,
pop-获取索引并返回值
移除-获取值,移除第一个匹配项,不返回任何内容
删除-获取索引,删除该索引的值,不返回任何内容
这里有很多最好的解释,但我会尽量简化。
在所有这些方法中,reverse&pop是后缀,delete是前缀。
remove():用于删除元素的第一个匹配项
1 2 3 4 | >>> 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():用于删除元素,如果:
未指定的
1 2 3 | >>>a.pop() >>>a [0, 3, 2, 1, 4, 6, 5] |
明确规定
索引的
1 2 3 | >>>a.pop(2) >>>a [0, 3, 1, 4, 6, 5] |
警告:前方有危险方法
delete():它是一个前缀方法。
注意同一方法的两种不同语法:[]和()。它有权:
1、删除索引
1 2 3 | >>>del a[1] >>>a [0, 1, 4, 6, 5] |
2.删除范围内的值[索引1:索引n]
1 2 3 | >>>del a[0:3] >>>a [6, 5] |
3.最后但不是列表,一次删除整个列表
如前所述。
1 2 | >>>del (a) >>>a |
希望这澄清了困惑,如果有的话。
不同数据结构上的任何操作/函数都是为特定操作定义的。在这种情况下,即删除元素、删除、弹出和删除。(如果考虑集合,则添加另一个操作-放弃)另一个令人困惑的情况是添加。插入/追加。为了演示,让我们实现deque。DEQUE是一种混合线性数据结构,您可以在其中添加元素/从两端删除元素。(后端和前端)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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[:] |
在这里,请参见操作:
1 2 3 4 5 | def deleteFront(self): return self.items.pop(0) def deleteRear(self): return self.items.pop() |
操作必须返回一些东西。所以,弹出-有和没有索引。如果我不想返回值:删除自己的项[0]
按值而非索引删除:
移除:
1
2
3
4
5list_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]
让我们考虑集合的情况。
1 2 3 4 5 6 7 8 9 10 | 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. |
列表上的移除操作被赋予要移除的值。它搜索列表以查找具有该值的项,并删除找到的第一个匹配项。如果没有匹配项,则是一个错误,会引发ValueError。
1 2 3 4 5 6 7 8 9 | >>> 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个项),它只会删除该项。甚至可以从列表中删除一个"切片"。如果索引超出范围,则会引发索引错误。
1 2 3 4 5 6 7 8 9 | >>> 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返回从列表中弹出的值。您可以选择为pop和pop提供索引值,而不是从列表末尾(例如listname.pop(0)将从列表中删除第一个项目,并返回第一个项目作为结果)。您可以使用它使列表的行为类似于队列,但是有一些库例程可以提供比pop(0)更好的性能的队列操作。如果索引超出范围,则会引发索引错误。
1 2 3 4 5 6 7 8 9 10 | >>> 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。
而pop和delete都采用索引来删除上述注释中所述的元素。关键的区别在于时间的复杂性。不带索引的pop()的时间复杂度是o(1),但与删除最后一个元素的情况不同。
如果用例总是删除最后一个元素,那么最好使用pop()而不是delete()。有关时间复杂性的更多说明,请参阅https://www.ics.uci.edu/~pattis/ics-33/schools/completityython.txt。
也可以使用remove按索引删除值。
1 2 3 | n = [1, 3, 5] n.remove(n[1]) |
n则指[1,5]