2011-11-02 10 views
68

मैं एक स्ट्रिंग सूची के तत्वों के रूप में शब्दों की एक बड़ी सूची लेने के लिए:पट्टी सभी

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n'] 

और फिर पट्टी समारोह का उपयोग कर, यह में बदल जाते हैं:

['this', 'is', 'a', 'list', 'of', 'words'] 

मैं सोचा था कि मैं क्या लिखा था काम करेगा, लेकिन मैं यह बताने वाला त्रुटि मिलती रहती है:

"'list' object has no attribute 'strip'"

यहाँ कोड है कि मैं करने की कोशिश की है:

strip_list = [] 
for lengths in range(1,20): 
    strip_list.append(0) #longest word in the text file is 20 characters long 
for a in lines: 
    strip_list.append(lines[a].strip()) 
+1

कृपया बताएं कि आप करने के लिए 0 जोड़कर कर रहे हैं 'strip_list' 19 बार फिर अपने छीन लाइनों जोड़कर। उस कोड के बारे में बहुत बुरा गंध है। अगर आपको उस फाइल को एक फाइल से मिल गया है, तो आपको इसे एक बड़ी सूची बनाने के रास्ते में अलग करना चाहिए और फिर इसे किसी अन्य बड़ी सूची में घुमा देना अच्छा विचार नहीं है। इसके अलावा 2, आपका कोड सबसे लंबे शब्द/रेखा की लंबाई जानने पर निर्भर नहीं होना चाहिए। थोड़ा सा कदम - आप क्या हासिल करने की कोशिश कर रहे हैं? 'Strip_list' के साथ आप क्या करेंगे? –

+0

संबंधित [सूची तत्व से \ n कैसे निकालें?] (Http: // stackoverflow।कॉम/क्यू/384950 9) –

उत्तर

128
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n'] 
>>> map(str.strip, my_list) 
['this', 'is', 'a', 'list', 'of', 'words'] 
+0

क्या मैं बस stripped_list = map (str.strip, my_list) कह सकता हूं और फिर इस नई सूची को मुद्रित करने के लिए stripped_list प्रिंट कर सकता हूं? –

+0

@ जॉर्जबर्रो हां। – agf

+16

यदि आप पाइथन 2 का उपयोग कर रहे हैं, तो ध्यान दें कि 'str.strip' केवल तभी काम करता है यदि आप सुनिश्चित हैं कि सूची में यूनिकोड स्ट्रिंग्स नहीं हैं। यदि इसमें 8-बिट और यूनिकोड स्ट्रिंग दोनों हो सकते हैं, तो ऊपर वर्णित 'lambda s: s.strip()' का उपयोग करें, या 'स्ट्रिंग' फ़ंक्शन का उपयोग करें जिसे आप 'स्ट्रिंग्स' मॉड्यूल से आयात कर सकते हैं। – Cito

31

आप lists comprehensions उपयोग कर सकते हैं:

strip_list = [item.strip() for item in lines] 

या map समारोह:

# with a lambda 
strip_list = map(lambda it: it.strip(), lines) 

# without a lambda 
strip_list = map(str.strip, lines) 
+3

दूसरे संस्करण में लैम्ब्डा ओवरकिल है। –

+1

आप सूची की शुरुआत में '0' मानों के साथ जो कुछ भी कर रहे हैं, वही करने के लिए उसी दृष्टिकोण का उपयोग कर सकते हैं। हालांकि मैं वास्तव में कल्पना नहीं कर सकता कि आप उन्हें एक ही परिणाम सूची में डालकर पूरा करने की कोशिश कर रहे हैं ... –

+1

पायथन 3 में, तीसरा रूप "बिना लैम्ब्डा" होना चाहिए 'strip_list = list (map (str .स्ट्रिप, रेखाएं)) 'मानचित्र के रूप में) एक नक्शा इटेटरेटर देता है। https://docs.python.org/3/library/functions.html#map – Devy

7

इस सूची comprehensions उपयोग किया जा सकता के रूप में PEP 202

[w.strip() for w in ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']] 
+0

मैं नाम 'सूची' से 'मानचित्र' में बदलने का विचार कर रहा था :) – Casey

2

अन्य सभी में परिभाषित किया गया जवाब, ए मुख्य रूप से सूची समझ के बारे में, महान हैं। लेकिन सिर्फ अपने त्रुटि को समझाने के लिए:

strip_list = [] 
for lengths in range(1,20): 
    strip_list.append(0) #longest word in the text file is 20 characters long 
for a in lines: 
    strip_list.append(lines[a].strip()) 

a अपनी सूची के एक सदस्य, नहीं एक सूचकांक है। क्या आप लिख सकता है यह है:

[...] 
for a in lines: 
    strip_list.append(a.strip()) 

एक अन्य महत्वपूर्ण टिप्पणी: यदि आप एक खाली सूची इस तरह से बना सकते हैं:

strip_list = [0] * 20 

लेकिन यह इतना उपयोगी अपनी सूची में सामान संलग्न कर देता है .append के रूप में नहीं है, । आपके मामले में, डिफॉल्ट मानों के साथ एक सूची बनाने के लिए उपयोगी नहीं है, क्योंकि आप स्ट्रिप किए गए तारों को जोड़ते समय प्रति आइटम आइटम बना देंगे।

strip_list = [] 
for a in lines: 
    strip_list.append(a.strip()) 

लेकिन, यकीन है कि के लिए, सबसे अच्छा एक यह एक है, के रूप में यह बिल्कुल वही बात है:

तो अपने कोड की तरह होना चाहिए

stripped = [line.strip() for line in lines] 

मामले में आप कुछ है .strip से अधिक जटिल, इसे एक फ़ंक्शन में डाल दें, और वही करें। सूचियों के साथ काम करने का यह सबसे पठनीय तरीका है।

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