2012-01-09 11 views
6

मेरे पास पूर्णांक के साथ विशाल सूचियों का एक गुच्छा है। ये सूचियां कुछ शून्यों से शुरू या समाप्त हो सकती हैं।lstrip(), rstrip() सूचियों के लिए

क्या सूची से बाएं या दाएं तरफ शून्य या तो शून्य के लिए कोई आसान तरीका है? तारों के लिए lstrip() या rstrip() के समान कुछ समान है?

डेटा

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

या

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

जैसे मैं व्यक्तिगत रूप से lstrip() या rstrip() में सक्षम होना चाहिए लग रहा है। मुझे सूची के दोनों तरफ से एक पट्टी की जरूरत नहीं है।

उत्तर

9

आप itertools.dropwhile() इस्तेमाल कर सकते हैं:

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

और rstrip() संस्करण के लिए: 'उलट (itertools.dropwhile (लैम्ब्डा एक्स: एक्स == 0, उलट (एल)))' –

+0

rstrip () संस्करण वास्तव में 'सूची है (उल्टा (सूची (itertools.dropwhile (लैम्ब्डा x: x == 0, उलट (एल)))) ' – josch

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

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

मैं अपनी सूची अनुमान लगा रहा हूँ पूर्णांकों का तार शामिल हैं? ['001','100'][001,100] के विपरीत के रूप में?

[x.strip('0') for x in bigList] आज़माएं। python docs में देखें।

+0

(वैसे, वहां भी मौजूद है (आश्चर्य, आश्चर्य) कार्यों' lstrip' और 'rstrip' ... –

1

अंतर्निहित itertools.dropwhile() से अधिक कुशल समाधान है। आप सर्वशक्तिमान collections.deque का उपयोग कर सकते हैं, जो इस कार्य के लिए आदर्श डेटा संरचना होगी, क्योंकि इसके बाएं या दाएं popO(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! 
संबंधित मुद्दे