1057

How do I remove the first item from a list?

[0, 1, 2, 3]   →   [1, 2, 3]
0

13 Answers 13

1649

You can find a short collection of useful list functions here.

list.pop(index)

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

del list[index]

>>> l = ['a', 'b', 'c', 'd']
>>> del l[0]
>>> l
['b', 'c', 'd']
>>> 

These both modify your original list.

Others have suggested using slicing:

  • Copies the list
  • Can return a subset

Also, if you are performing many pop(0), you should look at collections.deque

from collections import deque
>>> l = deque(['a', 'b', 'c', 'd'])
>>> l.popleft()
'a'
>>> l
deque(['b', 'c', 'd'])
  • Provides higher performance popping from left end of the list
2
  • 4
    You can also use negative indexes, which have the same meaning than with lists. Aug 22, 2018 at 10:55
  • 8
    In my case, the time went down from 1:31 min. with pop(0) to 200 - 250 ms by using deque. Thank you so much. Dec 13, 2020 at 18:05
264

Slicing:

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

Which would actually return a subset of the original but not modify it.

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

More on this here.

39

With list slicing, see the Python tutorial about lists for more details:

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

you would just do this

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

or l = l[1:]

Pros and Cons

Using pop you can retrieve the value

say x = l.pop(0) x would be 0

21

Then just delete it:

x = [0, 1, 2, 3, 4]
del x[0]
print x
# [1, 2, 3, 4]
1
  • 1
    For me this is the best answer related to the question (if you want to keep the original list object). Slicing x[1:] does not keep the original object but might be quicker. pop(0) is not required if the removed object should end up in the garbage collector.
    – B.R.
    Mar 11, 2023 at 22:36
11

Unpacking assignment:

You could use unpacking assignment as mentioned in PEP 3132.

Solution:

You should try unpacking like the following:

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

Explanation:

As mentioned in 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
  • 1
    This solution (which has been around since Python 3.0) should definitively be preferred if you need both, head and tail. Do you perhaps have some additional information at hand about the performance compared to pop(0)? Many thanks in advance.
    – Wolf
    May 8, 2023 at 10:34
9

There is a data structure called deque or double ended queue which is faster and efficient than a list. You can use your list and convert it to deque and do the required transformations in it. You can also convert the deque back to list.

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 also provides very useful functions like inserting elements to either side of the list or to any specific index. You can also rotate or reverse a deque. Give it a try!

1
  • It is only more efficient in some cases, not across the board. It has different tradeoffs than list, and why both exist. Mar 21, 2021 at 1:07
8

You can also use list.remove(a[0]) to pop out the first element in the list.

>>>> a=[1,2,3,4,5]
>>>> a.remove(a[0])
>>>> print a
>>>> [2,3,4,5]
8
  • 4
    OP is not asking about the best way to do it. This is just another approach to achieve the same!
    – vertexion
    Aug 24, 2014 at 14:27
  • 1
    Yes, another approach that has no advantage over the other answers. There are any number of ways to do it. Why not give an answer of a.remove(a[1-1])? That's another way. Aug 24, 2014 at 14:29
  • 2
    My point is that your answer is worse that the other answers, and has nothing to recommend it. There is no reason to use this answer over the others. Just because it's "another way" isn't a reason to add it here. Aug 24, 2014 at 14:44
  • 4
    @NedBatchelder Your point is moot. It's a extra method available to lists in Python, specific to this particular task, and for the sake of completeness it should be noted. The contrived BS a[1-1] example, on the other hand, it's not. Not to mention that his answer is not "worse than the other answers" in any way.
    – Hejazzman
    Nov 8, 2014 at 9:09
  • 9
    I stand by my question: this seems weird and contrived, and has nothing to recommend it. In fact, the first sentence is misleading, because you cannot remove the i'th element with list.remove(a[i]). With duplicate values, it may find an earlier element with the same value, and remove that one instead of the i'th. Nov 8, 2014 at 13:13
7

You can use list.reverse() to reverse the list, then list.pop() to remove the last element, for example:

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
1
  • 6
    Why do it so complicated when you can use l.pop(0)? You forgot to l.reverse() after using l.pop(). Your solution has bad performance Dec 12, 2020 at 18:50
7

If you are working with numpy you need to use the delete method:

import numpy as np

a = np.array([1, 2, 3, 4, 5])

a = np.delete(a, 0)

print(a) # [2 3 4 5]
2

This works for me, instead of using pop like below, which of course will be 0, because the result/return value of pop

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

Using this below method will skip the first value:

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

One another way to remove the first element not mentioned here is to assign an empty list to a slice containing the first element:

lst = [0, 1, 2, 3]

lst[:1] = []
print(lst)        # [1, 2, 3]

Unlike list.pop(), slicing doesn't throw an IndexError even if the list is empty, which is useful in some cases (and not useful in other cases).

lst = []

lst.pop(0)         # <--- IndexError
del lst[:1]        # <--- no error
lst[:] = lst[1:]   # <--- no error
lst[:1] = []       # <--- no error

Not the answer you're looking for? Browse other questions tagged or ask your own question.