2012-01-09 12 views
6

Mam kilka ogromnych list z liczbami całkowitymi. Te listy mogą zaczynać się lub kończyć od kilku zer.lstrip(), rstrip() dla list

Czy istnieje prosty sposób na usunięcie zer z lewej lub prawej strony z listy? Coś analogicznego do lstrip() lub rstrip() dla ciągów?

Dane wygląda

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

lub

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

muszę być w stanie indywidualnie lstrip() lub rstrip(). Nie potrzebuję paska z obu stron listy.

Odpowiedz

9

Można użyć itertools.dropwhile():

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

I dla rstrip (wariantu): 'odwrócone (itertools.dropwhile (N x: x == 0 odwróconych (L))) ' –

+0

rstrip () wariant jest w rzeczywistości 'list (odwrócona (lista (itertools.dropwhile (lambda x: x == 0, odwrócona (L))))) – josch

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

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

Zgaduję list zawiera ciągi liczb całkowitych? Podobnie jak ['001','100'] w przeciwieństwie do [001,100]?

Wypróbuj [x.strip('0') for x in bigList]. Zobacz str.split w python docs.

+0

(przy okazji, istnieją również funkcje (niespodzianka, niespodzianka)' lstrip' i 'rstrip' ... –

1

Istnieje bardziej wydajne rozwiązanie niż wbudowany itertools.dropwhile(). Możesz użyć wszechmocnego collections.deque, który byłby idealną strukturą danych dla tego zadania, ponieważ jego lewy lub prawy pop jest O(1). Oto przypadek lewy pas, a prawy pas będzie tylko lustrzanym odbiciem go:

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] 

Przetestujmy swoje wyniki z poniższego kodu, który wykorzystuje wbudowany w itertools.dropwhile():

from itertools import dropwhile 
print(list(dropwhile(lambda x: x == 0, l))) 

Oto badanie skuteczności:

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! 
Powiązane problemy