列表中的del,remove和pop之间的区别

sac*_*ula 818 python list

>>> 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]
>>> 
Run Code Online (Sandbox Code Playgroud)

以上三种方法从列表中删除元素有什么区别吗?

Mar*_*ers 1164

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

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]
Run Code Online (Sandbox Code Playgroud)

del 删除特定索引处的项目:

>>> a = [3, 2, 2, 1]
>>> del a[1]
>>> a
[3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

pop删除特定索引处的项目并返回它.

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]
Run Code Online (Sandbox Code Playgroud)

他们的错误模式也不同:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • @jxramos:`del`不是语法保留,不是.语法没有改变,就像`return`或`if`或`while`一样. (13认同)
  • “ del”示例有些误导。究竟删除了哪个元素?第二还是第三?您应该使用`[9,8,7,6]`,`del a [1]`和`[9,7,6]` (10认同)
  • 我认为 `del` 是类似于 `print` 的 python 2 语法保留,但它仍然适用于 python 3。 (5认同)
  • @rite2hhh 它测试平等。平等测试首先测试同一性作为优化 (3认同)
  • 值得一提的是,用户在遍历列表时要小心,并在迭代时在列表上同时使用这些功能。 (2认同)
  • @rite2hhh:[表达式参考](https://docs.python.org/3/reference/expressions.html#value-comparisons)中涵盖了值相等性。 (2认同)

Sve*_*ach 152

用于del按索引删除元素,pop()如果需要返回值,则通过索引remove()删除元素,以及按值删除元素.后者需要搜索列表,ValueError如果列表中没有出现这样的值则会引发.

in元素列表中删除索引时,这些方法的计算复杂性是

del     O(n - i)
pop     O(n - i)
remove  O(n)
Run Code Online (Sandbox Code Playgroud)

  • +1复杂性细分.说明当元素位于列表末尾时,delete和pop是如何保持不变的. (18认同)
  • @PlasmaBinturong 你应该使用你认为更具可读性的内容,除非你有数据证明性能很重要。如果有的话,您需要衡量在您的具体情况下什么更快。我的猜测是 `del` 稍微快一些,但出于不同的原因:在 C 中实现的类型上查找 `__delitem__` 是通过索引而不是名称进行的,而 `pop` 需要在整个过程之后查找描述符协议。函数本身的执行应该花费相同的时间。两者都返回一个指针——一个指向被删除的对象,另一个指向“None”。 (4认同)
  • 请记住……任何基于索引的东西都是一次 O(n-1) ……如果您必须进行查找(按值),它将遍历集合直到找到元素。 (3认同)
  • pop 是否需要搜索列表 (2认同)
  • @PepitoFernandez在Python中按索引查找的列表是O(1)。(Python中的列表类似于C ++中的向量。) (2认同)

Chr*_*nds 80

由于没有其他人提到它,请注意del(不像pop)允许删除一系列索引,因为列表切片:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]
Run Code Online (Sandbox Code Playgroud)

IndexError如果索引不在列表中,这也允许避免:

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]
Run Code Online (Sandbox Code Playgroud)


Sau*_*ahu 52

其他人已经很好地回答了.这个来自我的结尾:)

删除vs pop vs del

显然,pop是唯一一个返回值的人,并且remove是唯一一个搜索对象的人,同时del将自己限制为简单的删除.

  • 谢谢!一个注意事项:在python中,由于列表的实现方式(实际上是数组......!),“前进到该节点位置”是O(1) (3认同)

Bah*_*til 17

pop - 获取索引并返回值

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

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


May*_*til 17

这里有很多最佳的解释,但我会尽力简化一下。

在所有这些方法中,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]
Run Code Online (Sandbox Code Playgroud)

pop():如果满足以下条件,则用于删除元素:

未指定

pop() =>从列表末尾

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]
Run Code Online (Sandbox Code Playgroud)

指定的

pop(index) =>索引

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]
Run Code Online (Sandbox Code Playgroud)

警告:危险方法提前

delete():它是一个前缀方法。

注意同一方法的两种不同语法:[]和()。它具有以下功能:

1.删​​除索引

del a[index] =>用于删除索引及其关联值,就像pop。

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]
Run Code Online (Sandbox Code Playgroud)

2.删除[index 1:index N]范围内的值

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

>>>del a[0:3]
>>>a
[6, 5]
Run Code Online (Sandbox Code Playgroud)

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

del (a) =>如上所述。

>>>del (a)
>>>a
Run Code Online (Sandbox Code Playgroud)

希望这可以澄清混淆。

  • “后缀”和“前缀”有什么区别? (2认同)