Esiste una soluzione più efficiente rispetto allo itertools.dropwhile()
integrato. È possibile utilizzare l'onnipotente collections.deque
, che sarebbe la struttura dati ideale per questa attività, perché la sua pop
sinistra o destra è O(1)
. Ecco il caso sinistra-strip, e il diritto-strip sarà solo l'immagine speculare di esso:
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]
Testiamo la sua performance con il seguente codice che utilizza il built-in itertools.dropwhile()
:
from itertools import dropwhile
print(list(dropwhile(lambda x: x == 0, l)))
Ecco la prova di prestazione:
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!
E per la rstrip() variante: 'invertito (itertools.dropwhile (lambda x: x == 0, invertito (L)))' –
il rstrip () variante è infatti 'lista (invertita (lista (itertools.dropwhile (lambda x: x == 0, invertita (L)))))' – josch