Answers:
是的,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
del
不是语法保留,不是。语法不变,就像return
or if
或while
。
del
例子有些误导。究竟删除了哪个元素?第二还是第三?您应该使用过[9, 8, 7, 6]
,del a[1]
以及[9, 7, 6]
用于del
按索引删除元素,pop()
如果需要返回值,则按索引remove()
删除元素,以及按值删除元素。后者需要搜索列表,并在列表中ValueError
没有出现此类值时引发。
i
从n
元素列表中删除索引时,这些方法的计算复杂度为
del O(n - i)
pop O(n - i)
remove O(n)
del
稍快一些,但是由于另一个原因:__delitem__
在C中实现的类型的查找按索引而不是按名称进行,而pop
需要遵循整个描述符协议进行查找。函数本身的执行应花费相同的时间。两者都返回一个指针–一个指向已删除的对象,另一个指向None
。
这里有很多最佳的解释,但我会尽力简化一下。
在所有这些方法中,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
希望这可以澄清混淆。
pop-获取索引并返回值
remove-取值,删除第一个匹配项,不返回任何内容
delete-获取索引,删除该索引处的值,并且不返回任何内容
针对特定动作定义了对不同数据结构的任何操作/功能。在您的情况下,即删除一个元素,然后删除,弹出和删除。(如果考虑设置,则添加另一个操作-丢弃)添加时其他令人困惑的情况。插入/追加。为了演示,让我们实现双端队列。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
让我们考虑一下集合的情况。
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.
pop和delete都带有索引,以删除元素,如上面的注释所述。一个关键的区别是它们的时间复杂度。没有索引的pop()的时间复杂度为O(1),但删除最后一个元素的情况不同。
如果您的用例始终是删除最后一个元素,则始终首选使用pop()而不是delete()。有关时间复杂度的更多说明,请参阅https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
delete
。区别在于pop
返回值,并且del
适用于切片。在可行的情况下pop
,del
具有完全相同的计算复杂度(并且按常数项稍微快一些)。
列表上的删除操作具有要删除的值。它搜索列表以查找具有该值的项目,然后删除找到的第一个匹配项目。如果没有匹配的项目,将引发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。
您也可以使用remove来删除索引值。
n = [1, 3, 5]
n.remove(n[1])
n然后将指代[1,5]
n = [5, 3, 5]
然后尝试n.remove(n[2])
。
n.remove(n[2])
删除n[0]
,而不是n[2]
。因此,这不仅仅是无缘无故的线性时间(当N = 3时可能不是什么大问题),这也是错误的(无论N是什么大问题)