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 pop
là O(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!
Và đối với rstrip() biến thể: 'đảo ngược (itertools.dropwhile (lambda x: x == 0, đảo ngược (L)))' –
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