2012-08-29 13 views
17

अब मैं स्ट्रिंग की एक सूची पर पट्टी() निष्पादित करने का प्रयास किया गया है और मैं ऐसा किया के लिए:तारों की सूची पर स्ट्रिप() का उपयोग करने का कोई बेहतर तरीका है? - अजगर

i = 0 
for j in alist: 
    alist[i] = j.strip() 
    i+=1 

उस करने का एक बेहतर तरीका है?

+7

यादृच्छिक अज्ञात असम्बद्ध डाउनवोट के लिए उपवास। यदि प्रश्न के साथ कुछ गड़बड़ है, तो लेखक को बताए बिना डाउनवोट करना पूरी तरह से व्यर्थ है। – KRyan

+0

@ ड्रगूनवाइट सुनें, सुनो। – chucksmash

+3

यदि आप इंडेक्स का उपयोग करके पुनरावृत्त करना चाहते हैं, तो '(i, value) में गणना करें (alist) ' – Kos

उत्तर

26

शायद आपको एक प्रकार के रूप में list का उपयोग एक चर नाम से नहीं करना चाहिए। भले ही:

list = map(str.strip, list) 

इस समारोह str.strip प्रत्येक तत्व के list में, लागू एक नई सूची लौटने के लिए, और परिणाम list में वापस स्टोर करेगा।

+1

+1 जिस तरह से है। और यदि आप वैरिएबल को बाध्य करने के बजाय एक ही सूची उदाहरण को बदलना चाहते हैं (कहें, इस सूची में अन्य संदर्भों को तोड़ना नहीं है), स्लाइस सिंटैक्स का उपयोग करें जैसे @kojiro ने कहा – Kos

+2

एक उदाहरण जहां 'map' एक उत्कृष्ट है चुनाव। ('itertools.imap' निश्चित रूप से बेहतर हो सकता है या नहीं, उदाहरण के लिए, उदाहरण के लिए जब एक टुकड़ा आवंटित किया जाता है)। – Marcin

+0

@ कोस उस मामले में, एक इटरेटर-आधारित समाधान भी बेहतर होगा (क्योंकि यह पूरी सूची बनाने से बचाता है जिसे तब संदर्भित किया जाता है और कचरा संग्रह का इंतजार कर रहा है)। – Marcin

3

मुझे लगता है कि तुम्हारा मतलब

a_list = [s.strip() for s in a_list] 

एक जनरेटर अभिव्यक्ति का उपयोग करते हुए एक बेहतर दृष्टिकोण, इस तरह हो सकता है:

stripped_list = (s.strip() for s in a_list) 

आलसी मूल्यांकन का लाभ प्रदान करता है, तो strip केवल तब चलता है जब दिया तत्व, छीन लिया, की जरूरत है।

आप सूची के लिए संदर्भ की जरूरत है वर्तमान दायरे से बाहर बरकरार रहने के लिए, आप सूची टुकड़ा वाक्य रचना .:

a_list[:] = [s.strip() for s in a_list] 

विभिन्न दृष्टिकोण की गति में रुचि टिप्पणीकर्ताओं के लिए उपयोग करने के लिए चाहते हो सकता है, यह के रूप में अगर लग रहा है CPython में जनरेटर करने वाली टुकड़ा दृष्टिकोण कम से कम कुशल है:

>>> from timeit import timeit as t 
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""") 
4.35184121131897 
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.9129951000213623 
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.47947096824646 
+0

प्रोफाइलिंग और जांच के बजाय "माना जाता है कि थोड़ा अधिक कुशल" क्यों कहें? और बीटीडब्ल्यू '[:] 'उपयोगी है क्योंकि फिर यह वही सूची बदलता है, वैरिएबल को एक नई सूची में दोबारा निर्दिष्ट नहीं करता है। – Kos

+2

यह * कम * कुशल है क्योंकि इसे सूची में संदर्भ बदलने के बजाय एन आइटम कॉपी करना है। केवल "लाभ", जिसे आप की आवश्यकता या आवश्यकता नहीं है, यह है कि परिवर्तन किसी ऐसे व्यक्ति के लिए दृश्यमान होता है जिसकी मूल सूची वस्तु का कोई अन्य संदर्भ है। – delnan

+0

इमो, यह अजीब है। –

18

आप सूची comprehensions इस्तेमाल कर सकते हैं

stripped_list = [j.strip() for j in initial_list] 
+0

क्या आपको लगता है कि सूची की समझ कोड को तेजी से काम करती है ?? या बस छोटा ?? – Surya

+0

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

7

प्रदर्शन पर कुछ पेचीदा विचार विमर्श यहाँ क्या हुआ है, तो मुझे एक बेंचमार्क प्रदान करते हैं:

http://ideone.com/ldId8

noslice_map    : 0.0814900398254 
slice_map    : 0.084676027298 
noslice_comprehension : 0.0927240848541 
slice_comprehension  : 0.124806165695 
iter_manual    : 0.133514881134 
iter_enumerate   : 0.142778873444 
iter_range    : 0.160353899002 

तो:

  1. map(str.strip, my_list), सबसे तेज़ तरीका है यह सिर्फ एक छोटा सा तेज है comperhensions से।
    • उपयोग map या itertools.imap वहाँ एक भी समारोह है कि आप (str.split की तरह)
    • उपयोग comprehensions लागू करने के लिए एक और अधिक जटिल अभिव्यक्ति
  2. मैनुअल यात्रा धीमी तरीका है वहाँ अगर चाहते हैं, तो; एक उचित स्पष्टीकरण यह है कि इसे दुभाषिया को और अधिक काम करने की आवश्यकता होती है और कुशल सी रनटाइम कम
  3. आगे बढ़ें और my_list[:] = map... जैसे परिणाम असाइन करें, स्लाइस नोटेशन केवल एक छोटा ओवरहेड पेश करता है और यदि आपको वहां कुछ बग छोड़ने की संभावना है उस सूची के कई संदर्भ हैं।
    • किसी सूची को बदलने और इसे फिर से बनाने के बीच अंतर जानें।
+0

क्या आपका मतलब है 'my_list = map (str.strip, list [:]) '? 'दूसरी तरफ मुझे एक नाम त्रुटि देता है। – Izkata

+0

मेरा मतलब है 'my_list [:] = map (str.strip, my_list) '। लिंक के नीचे कोड देखें। – Kos

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