एक स्ट्रिंग सूची के तत्वों से अनुगामी न्यूलाइन निकालें


123

मुझे फॉर्म में शब्दों की एक बड़ी सूची लेनी है:

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

और फिर स्ट्रिप फंक्शन का उपयोग करते हुए इसे इसमें बदल दें:

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

मैंने सोचा था कि मैंने जो लिखा था वह काम करेगा, लेकिन मैं एक त्रुटि कह रहा हूँ:

"" सूची 'ऑब्जेक्ट में कोई विशेषता नहीं है' पट्टी '"

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

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_list19 बार अपनी स्ट्रिप्ड लाइन्स को क्यों जोड़ रहे हैं । उस कोड में इसके बारे में बहुत बुरी गंध है। इसके अलावा अगर आपको वह सामान किसी फाइल से मिला है, तो आपको उसे रास्ते में अलग करना चाहिए - एक बड़ी सूची का निर्माण करना और फिर उसे दूसरी बड़ी सूची में बदलना एक अच्छा विचार नहीं है। साथ ही 2, आपका कोड सबसे लंबे शब्द / लाइन की लंबाई जानने पर निर्भर नहीं होना चाहिए। थोड़ा पीछे हटें - आप क्या हासिल करने की कोशिश कर रहे हैं? तुम क्या strip_listकरोगे
जॉन मैकिन 21

जवाबों:


212
>>> 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']

क्या तब मैं सिर्फ छीन सकता था_सूची = नक्शा (str.strip, my_list) और फिर इस नई सूची को मुद्रित करने के लिए छीन लिया_सूची?
जॉर्ज

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

Cito टिप्पणी वास्तव में वह है जो सबसे अधिक प्रतिनिधि के योग्य है। नक्शा और समझ सूची OOP में समतुल्य नहीं हैं, क्योंकि हम कार्य पद्धति हैं, कार्य नहीं।
ई-सिटिस

सामरी में मानचित्र समारोह में बनाया गया
SIslam

39
निम्नलिखित से अवगत रहें: यदि आप पायथन 3.x का उपयोग कर रहे हैं और आप एक सूची वापस करना चाहते हैं list, तो आपको यह करना होगा , ताकि यह हो list(map(str.strip, my_list))। यह भी देखें कि: लिंक
तो एस


65

आप सूची समझ का उपयोग कर सकते हैं :

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
दूसरे संस्करण में लैम्ब्डा ओवरकिल है।
gddc 16

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

4
पायथन 3 में, "लैम्बडा के बिना" तीसरा फॉर्म strip_list = list(map(str.strip, lines))मैप के रूप में होना चाहिए () मैप इटेटर लौटाता है। docs.python.org/3/library/functions.html#map
Devy

7

पीईपी 202 में परिभाषित सूची समझ का उपयोग करके ऐसा किया जा सकता है

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

मैं से नाम बदलने का सोच रहा था listके लिए map:)
केसी

3

अन्य सभी उत्तर, और मुख्य रूप से सूची की समझ के बारे में, बहुत अच्छे हैं। लेकिन सिर्फ अपनी त्रुटि समझाने के लिए:

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, तो इसे किसी फ़ंक्शन में रखें, और ऐसा ही करें। सूचियों के साथ काम करने का यह सबसे पठनीय तरीका है।


2

यदि आपको केवल पीछे वाले व्हाट्सएप को हटाने की आवश्यकता है , तो आप उपयोग कर सकते हैं str.rstrip(), जो कि इससे थोड़ा अधिक कुशल होना चाहिए str.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.