¿La forma más eficiente de eliminar los primeros N elementos de una lista?


Necesito eliminar los primeros n elementos de una lista de objetos en Python 2.7. ¿Hay una manera fácil, sin usar bucles?

Author: Aran-Fey, 2015-11-10

4 answers

Puedes usar el corte de listas para archivar tu objetivo:

n = 5
mylist = [1,2,3,4,5,6,7,8,9]
newlist = mylist[n:]
print newlist

Salidas:

[6, 7, 8, 9]

O del si solo desea usar una lista:

n = 5
mylist = [1,2,3,4,5,6,7,8,9]
del mylist[:n]
print mylist

Salidas:

[6, 7, 8, 9]
 37
Author: Avión,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-26 06:48:31

Las listas Python no fueron hechas para operar al principio de la lista y son muy ineficaces en esta operación.

Mientras puedes escribir

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

Es muy ineficiente.


Si solo desea eliminar elementos de su lista, puede hacerlo con del:

del mylist[:n]

Que también es muy rápido:

In [34]: %%timeit
help=range(10000)
while help:
    del help[:1000]
   ....:
10000 loops, best of 3: 161 µs per loop

Si necesita obtener elementos desde el principio de la lista, debe usar collections.deque por Raymond Hettinger y su popleft() método.

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'

Una comparación:

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
 25
Author: Sebastian Wozny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-29 20:36:10
l = [1, 2, 3, 4, 5]
del l[0:3] # Here 3 specifies the number of items to be deleted.

Este es el código si desea eliminar un número de elementos de la lista. También podrías saltarte el cero antes del colon. No tiene esa importancia. Esto también podría servir.

l = [1, 2, 3, 4, 5]
del l[:3] # Here 3 specifies the number of items to be deleted.
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 09:31:26

Intenta ejecutar este código:

del x[:N]
 0
Author: Mangu Singh Rajpurohit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 09:30:07