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:
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
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]
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.
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.
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
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!
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]
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]
Success story sharing
pop(0)
to 200 - 250 ms by usingdeque
. Thank you so much.