2012-01-09 21 views
6

Ho un sacco di liste enormi con numeri interi. Queste liste possono iniziare o finire con un paio di zeri.lstrip(), rstrip() per gli elenchi

C'è un modo semplice per eliminare gli zeri sul lato sinistro o destro dall'elenco? Qualcosa di analogo a lstrip() o rstrip() per stringhe?

I dati si presenta come

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

o

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

devo essere in grado di singolarmente o lstrip()rstrip(). Non ho bisogno di una striscia da entrambi i lati della lista.

risposta

9

Si potrebbe utilizzare itertools.dropwhile():

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

E per la rstrip() variante: 'invertito (itertools.dropwhile (lambda x: x == 0, invertito (L)))' –

+0

il rstrip () variante è infatti 'lista (invertita (lista (itertools.dropwhile (lambda x: x == 0, invertita (L)))))' – josch

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

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

sto cercando di indovinare le vostre liste contiene stringhe di numeri interi? Come ['001','100'] in contrasto con [001,100]?

Prova [x.strip('0') for x in bigList]. Vedi str.split in python docs.

+0

(a proposito, esistono anche (sorpresa, sorpresa) le funzioni 'lstrip' e 'rstrip' ... –

1

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! 
Problemi correlati