2012-01-09 20 views
6

Tôi có một loạt các danh sách lớn với các số nguyên. Các danh sách này có thể bắt đầu hoặc kết thúc bằng một vài số không.lstrip(), rstrip() cho danh sách

Có cách nào dễ dàng để loại bỏ các số không ở bên trái hoặc bên phải từ danh sách không? Tương tự như lstrip() hoặc rstrip() cho chuỗi?

Dữ liệu trông giống như

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

hoặc

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

tôi phải có khả năng riêng lstrip() hoặc rstrip(). Tôi không cần một dải từ cả hai mặt của danh sách.

Trả lời

9

Bạn có thể sử dụng itertools.dropwhile():

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

Và đối với rstrip() biến thể: 'đảo ngược (itertools.dropwhile (lambda x: x == 0, đảo ngược (L)))' –

+0

các rstrip () biến thể thực tế là 'list (reversed (danh sách (itertools.dropwhile (lambda x: x == 0, đảo ngược (L)))))' – josch

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

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

Tôi đoán danh sách của bạn có chứa chuỗi các số nguyên? Giống như ['001','100'] thay vì [001,100]?

Hãy thử [x.strip('0') for x in bigList]. Xem str.split trong python docs.

+0

(bằng cách này, cũng có các hàm bất ngờ 'lstrip' và 'rstrip' ... –

1

Có giải pháp hiệu quả hơn tích hợp sẵn trong itertools.dropwhile(). Bạn có thể sử dụng toàn năng collections.deque, đây sẽ là cấu trúc dữ liệu lý tưởng cho tác vụ này, bởi vì bên trái hoặc bên phải popO(1). Đây là trường hợp trái dải, và phải dải sẽ là chỉ là hình ảnh phản chiếu của nó:

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] 

Hãy kiểm tra hiệu quả của nó đối với đoạn mã sau đó sử dụng được xây dựng trong itertools.dropwhile():

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

đây là bài kiểm tra hiệu suất:

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!