如何从列表中删除第一个项目?

1042

如何从列表中删除第一个项?

[0, 1, 2, 3][1, 2, 3]
13个回答

1629

你可以在这里找到一些有用的列表函数。

list.pop(index)

>>> l = ['a', 'b', 'c', 'd']
>>> l.pop(0)
'a'
>>> l
['b', 'c', 'd']
>>> 

del list[index]


删除list中索引为index的元素。
>>> l = ['a', 'b', 'c', 'd']
>>> del l[0]
>>> l
['b', 'c', 'd']
>>> 

这两种方法都会修改你的原始列表。

其他人建议使用切片:

  • 复制列表
  • 可以返回子集

此外,如果你要执行多个pop(0)操作,应该考虑使用collections.deque

from collections import deque
>>> l = deque(['a', 'b', 'c', 'd'])
>>> l.popleft()
'a'
>>> l
deque(['b', 'c', 'd'])
  • 提供更高效的从列表左端弹出

4
你也可以使用负索引,其含义与列表相同。 - Gabriel Devillers
8
对于我的情况而言,使用pop(0)时所需的时间从1分31秒降低到了200-250毫秒,而使用deque后能够实现此效果。非常感谢。 - Christoph S.

260

切片:

x = [0,1,2,3,4]
x = x[1:]

这将返回原始数据的子集,但不会修改它。


36
如果 x 是空的,x=x[1:] 会让它保持为空而不报错。但是,对于一个空列表 xx.pop(0) 会抛出异常。有时候抛出异常是我们想要的:如果假设列表中至少有一个元素是错误的,我们可能希望得到通知。 - ead
4
我更喜欢这个回复,因为突变几乎总是不好的。 - Onkeltem

63
>>> x = [0, 1, 2, 3, 4]
>>> x.pop(0)
0

关于这个问题,请点击此处了解更多信息。


36

使用列表切片,请参阅Python教程中关于列表的更多细节:

>>> l = [0, 1, 2, 3, 4]
>>> l[1:]
[1, 2, 3, 4]

36

你只需要这样做

l = [0, 1, 2, 3, 4]
l.pop(0)

或者 l = l[1:]

优缺点

使用pop可以检索值

例如 x = l.pop(0)x将是0


21
然后只需将其删除:
x = [0, 1, 2, 3, 4]
del x[0]
print x
# [1, 2, 3, 4]

1
对我来说,这是与问题相关的最佳答案(如果您想保留原始列表对象)。切片x[1:]不会保留原始对象,但可能更快。如果删除的对象应该进入垃圾回收器,则不需要使用pop(0) - B.R.

11

解包赋值:

您可以使用如PEP 3132中所述的解包赋值。

解决方案:

您应该尝试像以下这样进行解包:

>>> l = [0, 1, 2, 3, 4]
>>> _, *l = l
>>> l
[1, 2, 3, 4]

解释:

正如在PEP 3132中提到的:

This PEP proposes a change to iterable unpacking syntax, allowing to specify a "catch-all" name which will be assigned a list of all items not assigned to a "regular" name.

An example says more than a thousand words:

>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]

1
这个解决方案(自Python 3.0以来就存在)应该是首选,如果你需要头和尾。您是否手头有关于与pop(0)相比性能的额外信息?非常感谢。 - Wolf

9

你也可以使用 list.remove(a[0]) 来从列表中弹出第一个元素。

>>>> a=[1,2,3,4,5]
>>>> a.remove(a[0])
>>>> print a
>>>> [2,3,4,5]

4
OP并不是在询问最佳方案,这只是另一种实现相同目标的方法! - vertexion
1
是的,这是另一种与其他答案没有优势的方法。有很多种方法可以做到这一点。为什么不给出a.remove(a[1-1])的答案呢?那也是另一种方式。 - Ned Batchelder
2
我的观点是,你的答案比其他答案更糟糕,没有任何值得推荐的地方。没有理由使用这个答案而不是其他答案。仅仅因为它是“另一种方式”并不是在这里添加它的理由。 - Ned Batchelder
4
你的观点无关紧要。这是Python中可用于列表的额外方法,特定于这个特定的任务,为了完整起见应该注意到它。另一方面,那个人为的 a[1-1] 的例子不行。更不用说他的答案在任何方面都不比其他答案差。 - Hejazzman
8
我坚持我的问题:这似乎很奇怪而且不自然,没有什么值得推荐的。事实上,第一句话是误导性的,因为你不能用list.remove(a[i])来移除第i个元素。对于重复的值,它可能会找到一个较早的具有相同值的元素,而删除那个元素而不是第i个元素。 - Ned Batchelder
显示剩余3条评论

9

有一种叫做deque或双端队列的数据结构比列表更快更高效。您可以使用自己的列表并将其转换为deque,然后对其中所需的转换进行操作。 您也可以将deque转换回列表。

import collections
mylist = [0, 1, 2, 3, 4]

#make a deque from your list
de = collections.deque(mylist)

#you can remove from a deque from either left side or right side
de.popleft()
print(de)

#you can covert the deque back to list
mylist = list(de)
print(mylist)

Deque提供了非常有用的函数,例如在列表的任一侧或任何特定索引处插入元素。您还可以旋转或反转双端队列。试试吧!


它只在某些情况下更有效,而不是全面有效。它与列表具有不同的权衡,这就是为什么两者都存在的原因。 - Gringo Suave

8
您可以使用list.reverse()来反转列表,然后使用list.pop()来移除最后一个元素,例如:
l = [0, 1, 2, 3, 4]
l.reverse()
print l
[4, 3, 2, 1, 0]


l.pop()
0
l.pop()
1
l.pop()
2
l.pop()
3
l.pop()
4

5
为什么要这么复杂,当你可以使用 l.pop(0) 呢?在使用 l.pop() 后,你忘记了进行 l.reverse()。你的解决方案性能不佳。 - Christoph S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接