python列表del和pop_关于python:del,删除和弹出列表之间的区别

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

>>>

从列表中删除元素的上述三种方法有什么不同吗?

关于集合数据结构的类似行上的相关文章-python中set.discard和set.remove方法之间的运行时差异?

是的,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"", line 1, in

ValueError: list.remove(x): x not in list

>>> del a[7]

Traceback (most recent call last):

File"", line 1, in

IndexError: list assignment index out of range

>>> a.pop(7)

Traceback (most recent call last):

File"", line 1, in

IndexError: pop index out of range

我认为del是一个类似于print的python 2语法保留,但它仍然可以在python 3中工作。

@jxramos:del不是语法保留,不。语法不变,就像return或if或while一样。

值得一提的是,用户在遍历列表时应该小心,并在进行迭代的同时在列表上使用这些函数。

del的例子有些误导。确切地说,哪个元素被移除了?第二个还是第三个?你应该使用[9, 8, 7, 6]、del a[1]和[9, 7, 6]。

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

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

del     O(n - i)

pop     O(n - i)

remove  O(n)

Pop是否需要搜索列表

@奎托斯:不,看我的编辑。

+1用于复杂性分析。说明当元素位于列表末尾时,删除和弹出是如何保持不变的。

记住伙计们…任何基于索引的内容都是一次性的(n-1)。如果必须进行查找(按值),它将遍历集合,直到找到元素为止。

@pepitofernandez在列表中按索引查找的是python中的o(1)。(Python中的列表类似于C++中的向量)。

@我想说的是斯文马纳赫。O(1)。谢谢你的纠正。

由于没有其他人提到它,请注意,由于列表切片,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]

已经被其他人很好地回答了。我这边的这个:)

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

谢谢!一个注意事项:在Python中,由于列表的实现方式(实际上有数组…!)"前进到节点位置"为O(1)

很好的视觉表现!

pop-获取索引并返回值

移除-获取值,移除第一个匹配项,不返回任何内容

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

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

在所有这些方法中,reverse&pop是后缀,delete是前缀。

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.删除范围内的值[索引1:索引n]

del a[0:3]=>范围内有多个值

>>>del a[0:3]

>>>a

[6, 5]

3.最后但不是列表,一次删除整个列表

如前所述。

>>>del (a)

>>>a

希望这澄清了困惑,如果有的话。

不同数据结构上的任何操作/函数都是为特定操作定义的。在这种情况下,即删除元素、删除、弹出和删除。(如果考虑集合,则添加另一个操作-放弃)另一个令人困惑的情况是添加。插入/追加。为了演示,让我们实现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()

操作必须返回一些东西。所以,弹出-有和没有索引。如果我不想返回值:删除自己的项[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.

列表上的移除操作被赋予要移除的值。它搜索列表以查找具有该值的项,并删除找到的第一个匹配项。如果没有匹配项,则是一个错误,会引发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"", line 1, in

del x[7]

IndexError: list assignment index out of range

del语句可用于删除整个列表。如果您有一个特定的列表项作为del的参数(例如,listname[7]专门引用列表中的第8个项),它只会删除该项。甚至可以从列表中删除一个"切片"。如果索引超出范围,则会引发索引错误。

>>> x = [1, 2, 3, 4]

>>> del x[3]

>>> x

[1, 2, 3]

>>> del x[4]

Traceback (most recent call last):

File"", line 1, in

del x[4]

IndexError: list assignment index out of range

pop的常用用法是在将列表用作堆栈时从列表中删除最后一项。与del不同,pop返回从列表中弹出的值。您可以选择为pop和pop提供索引值,而不是从列表末尾(例如listname.pop(0)将从列表中删除第一个项目,并返回第一个项目作为结果)。您可以使用它使列表的行为类似于队列,但是有一些库例程可以提供比pop(0)更好的性能的队列操作。如果索引超出范围,则会引发索引错误。

>>> x = [1, 2, 3]

>>> x.pop(2)

3

>>> x

[1, 2]

>>> x.pop(4)

Traceback (most recent call last):

File"", line 1, in

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。

这在很多方面都是错误的。没有像delete这样的方法。区别在于pop返回值,del在切片上工作。在pop工作的情况下,del具有完全相同的计算复杂度(以常数项计算速度略快)。

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

n = [1, 3, 5]

n.remove(n[1])

n则指[1,5]

先试试n = [5, 3, 5],再试试n.remove(n[2])。

@abarnet您的用例与下面的案例同步工作n=[5,3,5],然后n.remove(5)。这两个元素都会从列表中删除第一个遇到的元素。

@Akhilghatiki-n.remove(n[2])移除了n[0],而不是n[2]。所以这不仅仅是线性时间,没有理由(当n=3时可能不是什么大问题),它也是错误的(不管n是什么大问题)

@你说得对!!!!我忽略了它。谢谢!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值