2015-07-26 6 views
12

अजगरपायथन - इस मामले में सूची समझ कुशल है?

input_list = [' \n ',' data1\n ',' data2\n',' \n','data3\n'.....] 

प्रत्येक सूची तत्व शामिल या तो नई लाइन वर्ण या नई पंक्ति वर्ण

साथ डेटा के साथ खाली स्थान नीचे कोड का उपयोग कर इसे साफ़ किया अप में इनपुट "गंदे" सूची है ..

cleaned_up_list = [data.strip() for data in input_list if data.strip()] 

देता

cleaned_up_list = ['data1','data2','data3','data4'..] 

क्या उपरोक्त सूची समझ के दौरान पाइथन आंतरिक रूप से strip() पर कॉल करता है? या मुझे एक बार for लूप पुनरावृत्ति और strip() का उपयोग करना होगा यदि मैं दक्षता की परवाह करता हूं?

for data in input_list 
    clean_data = data.strip() 
    if(clean_data): 
     cleaned_up_list.append(clean_data) 
+4

आप इसे एक कस्टम फ़ंक्शन लिखकर स्वयं को ढूंढ सकते हैं जो हर बार काउंटर और/या प्रिंटर को बढ़ाता है। –

उत्तर

14

अपनी सूची कंप्यूटर अनुप्रयोग पट्टी का उपयोग करना दो बार कहा जाता है, एक बार एक जनरल exp उपयोग करें यदि आप केवल कॉल पट्टी करना चाहते हैं और समझ रखें:

input_list[:] = [x for x in (s.strip() for s in input_list) if x] 

इनपुट:

input_list = [' \n ',' data1\n ',' data2\n',' \n','data3\n'] 

आउटपुट:

['data1', 'data2', 'data3'] 

input_list[:] मूल सूची को बदल देगा जो आप चाहते हैं कि हो सकता है या नहीं, यदि आप वास्तव में एक नई सूची बनाना चाहते हैं तो बस cleaned_up_list = ... का उपयोग करें।

मैं हमेशा जनरेटर के बजाय अजगर 3 में अजगर 2 में itertools.imap और map का उपयोग कर बड़ा आदानों के लिए सबसे कारगर हो पाया:

from itertools import imap 
input_list[:] = [x for x in imap(str.strip, input_list) if x] 

अलग दृष्टिकोण के साथ कुछ समय:

In [17]: input_list = [choice(input_list) for _ in range(1000000)] 

In [19]: timeit filter(None, imap(str.strip, input_list)) 
10 loops, best of 3: 115 ms per loop 

In [20]: timeit list(ifilter(None,imap(str.strip,input_list))) 
10 loops, best of 3: 110 ms per loop 

In [21]: timeit [x for x in imap(str.strip,input_list) if x] 
10 loops, best of 3: 125 ms per loop 

In [22]: timeit [x for x in (s.strip() for s in input_list) if x] 
10 loops, best of 3: 145 ms per loop 

In [23]: timeit [data.strip() for data in input_list if data.strip()] 
10 loops, best of 3: 160 ms per loop 

In [24]: %%timeit             
    ....:  cleaned_up_list = [] 
    ....:  for data in input_list: 
    ....:   clean_data = data.strip() 
    ....:   if clean_data: 
    ....:    cleaned_up_list.append(clean_data) 
    ....: 

10 loops, best of 3: 150 ms per loop 

In [25]: 

In [25]: %%timeit              
    ....:  cleaned_up_list = [] 
    ....:  append = cleaned_up_list.append 
    ....:  for data in input_list: 
    ....:   clean_data = data.strip() 
    ....:   if clean_data: 
    ....:    append(clean_data) 
    ....: 

10 loops, best of 3: 123 ms per loop 

सबसे तेज़ दृष्टिकोण वास्तव में itertools.ifilteritertools.imap के साथ संयुक्त के साथ filter के साथ संयुक्त है।

फ़ंक्शन संदर्भ list.append का पुनर्मूल्यांकन करने की आवश्यकता को हटाने के लिए प्रत्येक पुनरावृत्ति अधिक कुशल है, यदि आप एक लूप से फंस गए थे और सबसे कुशल दृष्टिकोण चाहते थे तो यह एक व्यवहार्य विकल्प है।

+1

क्या यह 'स्ट्रिप() 'को दो बार कॉल करने से हल्का है? – clemtoy

+1

बहुत सारे डेटा के लिए, हाँ, क्योंकि आप एक बार समझ को स्थापित करते हैं, लेकिन सूची में प्रत्येक तत्व पर पट्टी को बुलाया जाता है। –

+0

@clemtoy, मैंने विभिन्न दृष्टिकोणों के लिए कुछ समय जोड़े, आप देख सकते हैं कि कॉलिंग स्ट्रिप दो बार कम से कम कुशल दृष्टिकोण –

संबंधित मुद्दे