अंतर्निहित itertools.dropwhile()
से अधिक कुशल समाधान है। आप सर्वशक्तिमान collections.deque
का उपयोग कर सकते हैं, जो इस कार्य के लिए आदर्श डेटा संरचना होगी, क्योंकि इसके बाएं या दाएं pop
O(1)
है। यहाँ बाएं पट्टी मामला है, और सही-पट्टी इसके बारे में सिर्फ दर्पण छवि होने जा रहा है:
:
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]
के निम्नलिखित कोड है कि निर्मित itertools.dropwhile()
इस्तेमाल के खिलाफ अपने प्रदर्शन का परीक्षण करें
from itertools import dropwhile
print(list(dropwhile(lambda x: x == 0, l)))
यहाँ प्रदर्शन परीक्षण है:
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!
और rstrip() संस्करण के लिए: 'उलट (itertools.dropwhile (लैम्ब्डा एक्स: एक्स == 0, उलट (एल)))' –
rstrip () संस्करण वास्तव में 'सूची है (उल्टा (सूची (itertools.dropwhile (लैम्ब्डा x: x == 0, उलट (एल)))) ' – josch