The most efficient way to remove first N elements in a list?
Question:
I need to remove the first n elements from a list of objects in Python 2.7. Is there an easy way, without using loops?
Answers:
Python lists were not made to operate on the beginning of the list and are very ineffective at this operation.
While you can write
mylist = [1, 2 ,3 ,4]
mylist.pop(0)
It’s very inefficient.
If you only want to delete items from your list, you can do this with del
:
del mylist[:n]
Which is also really fast:
In [34]: %%timeit
help=range(10000)
while help:
del help[:1000]
....:
10000 loops, best of 3: 161 µs per loop
If you need to obtain elements from the beginning of the list, you should use collections.deque
by Raymond Hettinger and its popleft()
method.
from collections import deque
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop() # return and remove the rightmost item
'j'
>>> d.popleft() # return and remove the leftmost item
'f'
A comparison:
list + pop(0)
In [30]: %%timeit
....: help=range(10000)
....: while help:
....: help.pop(0)
....:
100 loops, best of 3: 17.9 ms per loop
deque + popleft()
In [33]: %%timeit
help=deque(range(10000))
while help:
help.popleft()
....:
1000 loops, best of 3: 812 µs per loop
Try to run this code:
del x[:N]
You can use list slicing to archive your goal.
Remove the first 5 elements:
n = 5
mylist = [1,2,3,4,5,6,7,8,9]
newlist = mylist[n:]
print newlist
Outputs:
[6, 7, 8, 9]
Or del
if you only want to use one list:
n = 5
mylist = [1,2,3,4,5,6,7,8,9]
del mylist[:n]
print mylist
Outputs:
[6, 7, 8, 9]
l = [1, 2, 3, 4, 5]
del l[0:3] # Here 3 specifies the number of items to be deleted.
This is the code if you want to delete a number of items from the list. You might as well skip the zero before the colon. It does not have that importance. This might do as well.
l = [1, 2, 3, 4, 5]
del l[:3] # Here 3 specifies the number of items to be deleted.
l = [5,1,4,2,3,6]
Sort the list from smallest to largest
l.sort()
Remove the first 2 items in the list
for _ in range(2)
l.remove(l[0])
Print the list
print(l)
Let’s say you have this list:
mylist = [1,2,3,4,5,6,7,8,9]
And you want to remove the x
last elements and store them in another list
newlist = [mylist.pop() for _ in range(x)]
You can modify the argument you pass to pop in order to remove elements from the beginning
newlist = [mylist.pop(0) for _ in range(x)]
Or leave the first element and remove x
elements after
newlist = [mylist.pop(1) for _ in range(x)]
The most efficient approach, memory-wise and complexity-wise, is this:
popped_items = lst[:n]
del lst[:n]
It allows you to first obtain the first n items and only allocate the space for them. And then, you delete them from the initial list, which is also fast.
I need to remove the first n elements from a list of objects in Python 2.7. Is there an easy way, without using loops?
Python lists were not made to operate on the beginning of the list and are very ineffective at this operation.
While you can write
mylist = [1, 2 ,3 ,4]
mylist.pop(0)
It’s very inefficient.
If you only want to delete items from your list, you can do this with del
:
del mylist[:n]
Which is also really fast:
In [34]: %%timeit
help=range(10000)
while help:
del help[:1000]
....:
10000 loops, best of 3: 161 µs per loop
If you need to obtain elements from the beginning of the list, you should use collections.deque
by Raymond Hettinger and its popleft()
method.
from collections import deque
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop() # return and remove the rightmost item
'j'
>>> d.popleft() # return and remove the leftmost item
'f'
A comparison:
list + pop(0)
In [30]: %%timeit
....: help=range(10000)
....: while help:
....: help.pop(0)
....:
100 loops, best of 3: 17.9 ms per loop
deque + popleft()
In [33]: %%timeit
help=deque(range(10000))
while help:
help.popleft()
....:
1000 loops, best of 3: 812 µs per loop
Try to run this code:
del x[:N]
You can use list slicing to archive your goal.
Remove the first 5 elements:
n = 5
mylist = [1,2,3,4,5,6,7,8,9]
newlist = mylist[n:]
print newlist
Outputs:
[6, 7, 8, 9]
Or del
if you only want to use one list:
n = 5
mylist = [1,2,3,4,5,6,7,8,9]
del mylist[:n]
print mylist
Outputs:
[6, 7, 8, 9]
l = [1, 2, 3, 4, 5]
del l[0:3] # Here 3 specifies the number of items to be deleted.
This is the code if you want to delete a number of items from the list. You might as well skip the zero before the colon. It does not have that importance. This might do as well.
l = [1, 2, 3, 4, 5]
del l[:3] # Here 3 specifies the number of items to be deleted.
l = [5,1,4,2,3,6]
Sort the list from smallest to largest
l.sort()
Remove the first 2 items in the list
for _ in range(2)
l.remove(l[0])
Print the list
print(l)
Let’s say you have this list:
mylist = [1,2,3,4,5,6,7,8,9]
And you want to remove the x
last elements and store them in another list
newlist = [mylist.pop() for _ in range(x)]
You can modify the argument you pass to pop in order to remove elements from the beginning
newlist = [mylist.pop(0) for _ in range(x)]
Or leave the first element and remove x
elements after
newlist = [mylist.pop(1) for _ in range(x)]
The most efficient approach, memory-wise and complexity-wise, is this:
popped_items = lst[:n]
del lst[:n]
It allows you to first obtain the first n items and only allocate the space for them. And then, you delete them from the initial list, which is also fast.