2012-01-09 22 views
6

Tengo un montón de enormes listas con números enteros. Estas listas pueden comenzar o terminar con un par de ceros.lstrip(), rstrip() para listas

¿Hay alguna manera fácil de quitar los ceros del lado izquierdo o derecho de la lista? ¿Algo parecido a lstrip() o rstrip() para cadenas?

Los datos se parece

[0,0,0,1,2,3,4] 

o

[1,2,3,4,0,0,0] 

debo ser capaz de forma individual o lstrip()rstrip(). No necesito una tira de ambos lados de la lista.

Respuesta

9

Usted podría utilizar itertools.dropwhile():

>>> L = [0, 0, 1, 1, 2, 2, 0] 
>>> list(itertools.dropwhile(lambda x: x == 0, L)) 
[1, 1, 2, 2, 0] 
+3

Y para el rstrip() variante: 'invertido (itertools.dropwhile (lambda x: x == 0, invertido (L)))' –

+0

la rstrip () variante es de hecho lista '(invertida (lista (itertools.dropwhile (lambda x: x == 0, invertido (L)))))' – josch

0
l = ['10000', '000001'] 
map(lambda x: x.strip('0'), l) 

>>> ['1', '1'] 
-1

estoy adivinando sus listas contiene cadenas de los números enteros? Me gusta ['001','100'] en comparación con [001,100]?

Probar [x.strip('0') for x in bigList]. Consulte str.split en python docs.

+0

(por cierto, también existen (sorpresa, sorpresa) funciones 'lstrip' y 'rstrip' ... –

1

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! 
Cuestiones relacionadas