How do I remove the first item from a list?
[0, 1, 2, 3] → [1, 2, 3]
You can find a short collection of useful list functions here.
>>> l = ['a', 'b', 'c', 'd']
>>> l.pop(0)
'a'
>>> l
['b', 'c', 'd']
>>>
>>> l = ['a', 'b', 'c', 'd']
>>> del l[0]
>>> l
['b', 'c', 'd']
>>>
These both modify your original list.
Others have suggested using slicing:
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'])
pop(0)
to 200 - 250 ms by using deque
. Thank you so much.
Dec 13, 2020 at 18:05
Slicing:
x = [0,1,2,3,4]
x = x[1:]
Which would actually return a subset of the original but not modify it.
x
is empty, x=x[1:]
would leave it empty without complaining. x.pop(0)
would throw for an empty list x
. Sometimes throwing is what one wants: If the assumption that there is at least an element in the list is wrong, one might want to get notified.
With list slicing, see the Python tutorial about lists for more details:
>>> l = [0, 1, 2, 3, 4]
>>> l[1:]
[1, 2, 3, 4]
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
Then just delete it:
x = [0, 1, 2, 3, 4]
del x[0]
print x
# [1, 2, 3, 4]
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.
You could use unpacking assignment as mentioned in PEP 3132.
You should try unpacking like the following:
>>> l = [0, 1, 2, 3, 4]
>>> _, *l = l
>>> l
[1, 2, 3, 4]
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]
pop(0)
? Many thanks in advance.
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!
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]
a.remove(a[1-1])
? That's another way.
Aug 24, 2014 at 14:29
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
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
l.pop(0)
? You forgot to l.reverse()
after using l.pop()
. Your solution has bad performance
Dec 12, 2020 at 18:50
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]
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