Hay una solución más eficiente que la incorporada en itertools.dropwhile()
. Puede usar el omnipotente collections.deque
, que sería la estructura de datos ideal para esta tarea, porque su izquierda o derecha pop
es O(1)
. Aquí es el caso izquierda-tira, y el derecho de bandas va a ser la imagen especular de la misma:
from collections import deque
def noLeadingZero(l):
d = deque(l)
for e in l:
if e == 0:
d.popleft()
else:
break
return list(d)
l = [0, 0, 1, 1, 2, 2, 0]
print(noLeadingZero(l))
# Result:
# [1, 1, 2, 2, 0]
vamos a probar su rentabilidad con la siguiente código que utiliza el incorporado en itertools.dropwhile()
:
from itertools import dropwhile
print(list(dropwhile(lambda x: x == 0, l)))
Aquí está la prueba de rendimiento:
import timeit
print timeit.timeit(
setup= """from itertools import dropwhile
l = [0, 0, 1, 1, 2, 2, 0]""",
stmt="""list(dropwhile(lambda x: x == 0, l))""") #2.308
print timeit.timeit(
setup= """from collections import deque
l = [0, 0, 1, 1, 2, 2, 0]
def noLeadingZero(l):
d = deque(l)
for e in l:
if e == 0:
d.popleft()
else:
break
return list(d)""",
stmt="""noLeadingZero(l)""") #1.684 -> Win!
Y para el rstrip() variante: 'invertido (itertools.dropwhile (lambda x: x == 0, invertido (L)))' –
la rstrip () variante es de hecho lista '(invertida (lista (itertools.dropwhile (lambda x: x == 0, invertido (L)))))' – josch