2009-04-13 16 views
387

मैं चाहता हूं कि मेरा पायथन फ़ंक्शन एक वाक्य (इनपुट) को विभाजित करे और प्रत्येक शब्द को सूची में संग्रहीत करे। जो कोड मैंने अभी लिखा है वह वाक्य को विभाजित करता है, लेकिन शब्दों को सूची के रूप में संग्रहीत नहीं करता है। मैं उसको कैसे करू?एक स्ट्रिंग को सूची में कैसे विभाजित करें?

def split_line(text): 

    # split the text 
    words = text.split() 

    # for each word in the line: 
    for word in words: 

     # print the word 
     print(word) 
+1

इस कोड के किस हिस्से काम नहीं करता है? क्या आप त्रुटि संदेश या समस्या का सामना कर सकते हैं? –

+2

जैसा कि है, आप सूची में प्रत्येक शब्द के लिए शब्दों की पूरी सूची प्रिंट करेंगे। मुझे लगता है कि आप अपनी अंतिम पंक्ति के रूप में 'प्रिंट (शब्द)' का उपयोग करना चाहते थे। – tgray

+19

सही उत्तर को शामिल करने के लिए प्रश्न संपादित किया गया है, इसलिए अब यह समझ में नहीं आता है कि – Joop

उत्तर

318
text.split() 

यह प्रत्येक शब्द को सूची में स्टोर करने के लिए पर्याप्त होना चाहिए। words पहले से ही वाक्य से शब्दों की एक सूची है, इसलिए लूप की कोई आवश्यकता नहीं है।

दूसरा, यह एक टाइपो हो सकता है, लेकिन आपके लूप को थोड़ा गड़बड़ हो गया है। क्या तुम सच में संलग्न का उपयोग करना चाहते था, तो ऐसा होगा:

words.append(word) 

नहीं

word.append(words) 
319

खाली स्थान के के किसी भी लगातार रन पर text में स्ट्रिंग विभाजन।

words = text.split()  

स्प्लिट सीमांकक पर text में स्ट्रिंग: ","

words = text.split(",") 

शब्द चर एक list हो सकता है और सीमांकक पर text विभाजित होने से रोकने शब्द शामिल होंगे।

66

str.split()

वापसी शब्द स्ट्रिंग में की सूची, के रूप में सितम्बर का उपयोग कर delimiter ... यदि सीपी निर्दिष्ट नहीं है या कोई नहीं है, तो एक अलग विभाजन एल्गोरिदम लागू होता है: लगातार सफेद जगहों के रनों को एकल विभाजक के रूप में माना जाता है, और परिणाम में स्ट्रिंग के पीछे या पीछे की ओर बढ़ने पर परिणाम या अंत में कोई खाली तार नहीं होगा।

>>> line="a sentence with a few words" 
>>> line.split() 
['a', 'sentence', 'with', 'a', 'few', 'words'] 
>>> 
+0

@warvariuc - https://docs.python.org/2/library/stdtypes.html#str.split – gimel

2

मुझे लगता है कि आप लिखने में कोई त्रुटि की वजह से भ्रमित हैं।

print(word) साथ print(words) बदलें अपने पाश अंदर एक अलग लाइन

13

मैं अपने अजगर समारोह एक वाक्य (इनपुट) विभाजित करना चाहते हैं पर छपी हर शब्द के लिए और एक सूची

में प्रत्येक शब्द की दुकान

str().split() विधि से करता है, यह एक स्ट्रिंग लेता है, एक सूची में विभाजन:

>>> the_string = "this is a sentence" 
>>> words = the_string.split(" ") 
>>> print(words) 
['this', 'is', 'a', 'sentence'] 
>>> type(words) 
<type 'list'> # or <class 'list'> in Python 3.0 

आपको हो रही समस्या है, क्योंकि लिखने में कोई त्रुटि की है, तो आप print(words) बजाय print(word) लिखा है: current_word को

word चर नाम बदल रहा है, यह आपने क्या खाया है:

def split_line(text): 
    words = text.split() 
    for current_word in words: 
     print(words) 

..जब आप करना चाहिए था:

def split_line(text): 
    words = text.split() 
    for current_word in words: 
     print(current_word) 

किसी कारण से आप मैन्युअल रूप से पाश के लिए एक सूची का निर्माण करना चाहते हैं, तो आप सूची append() विधि उदाहरण के लिए प्रयोग करेंगे, शायद इसलिए क्योंकि आप लोअर केस सभी शब्दों करना चाहते हैं ():

my_list = [] # make empty list 
for current_word in words: 
    my_list.append(current_word.lower()) 

या अधिक एक सा neater, का उपयोग कर एक list-comprehension:

my_list = [current_word.lower() for current_word in words] 
38

आप अपनी सजा-एज-ए-सूची के साथ क्या करने की योजना क्या आधार पर, आप कर सकते हैं Natural Language Took Kit पर देखें। यह टेक्स्ट प्रोसेसिंग और मूल्यांकन के साथ भारी सौदे करता है। आप भी अपनी समस्या को हल करने के लिए इसका इस्तेमाल कर सकते हैं:

import nltk 
words = nltk.word_tokenize(raw_sentence) 

यह बाहर बंटवारे विराम चिह्न का अतिरिक्त लाभ है।

उदाहरण:

>>> import nltk 
>>> s = "The fox's foot grazed the sleeping dog, waking it." 
>>> words = nltk.word_tokenize(s) 
>>> words 
['The', 'fox', "'s", 'foot', 'grazed', 'the', 'sleeping', 'dog', ',', 
'waking', 'it', '.'] 

यह आप किसी भी विराम चिह्न आप नहीं चाहते को फ़िल्टर और केवल शब्दों का प्रयोग करने के लिए अनुमति देता है।

कृपया ध्यान दें कि string.split() का उपयोग कर अन्य समाधान बेहतर हैं यदि आप प्रेषण के किसी भी जटिल हेरफेर करने की योजना नहीं बनाते हैं।

+4

'split()' से जुड़ा होना चाहिए, विभाजक के रूप में सफेद-स्थान पर निर्भर करता है, इसलिए यह अलग होने में विफल हो जाएगा हाइफेनेटेड शब्द - और लंबे-डैश से अलग वाक्यांश भी विभाजित करने में असफल हो जाएंगे। और यदि वाक्य में रिक्त स्थान के बिना कोई विराम चिह्न होता है, तो वे चिपकने में असफल हो जाएंगे। किसी वास्तविक दुनिया के टेक्स्ट पार्सिंग (इस टिप्पणी के लिए) के लिए, आपका nltk सुझाव विभाजन() 'से काफी बेहतर है। – hobs

+1

संभावित रूप से उपयोगी, हालांकि मैं इसे "शब्दों" में विभाजित करने के रूप में वर्णित नहीं करता। किसी भी सादे अंग्रेजी परिभाषा से, '', '' और '' '' '' 'शब्द नहीं हैं। आम तौर पर, यदि आप उपरोक्त वाक्य को विराम चिह्न-जागरूक तरीके से "शब्दों" में विभाजित करना चाहते हैं, तो आप अल्पविराम को बाहर निकालना चाहते हैं और एक शब्द के रूप में '' फॉक्स '' प्राप्त करना चाहते हैं। –

+1

पाइथन 2.7+ अप्रैल 2016 तक। – AnneTheAgile

20

इस एल्गोरिदम के बारे में कैसे? व्हाइटस्पेस पर टेक्स्ट विभाजित करें, फिर विराम चिह्न को ट्रिम करें। यह we're जैसे शब्दों के अंदर apostrophes को नुकसान पहुंचाए बिना शब्दों के किनारे से विराम चिह्न को सावधानीपूर्वक हटा देता है।

>>> text 
"'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'" 

>>> text.split() 
["'Oh,", 'you', "can't", 'help', "that,'", 'said', 'the', 'Cat:', "'we're", 'all', 'mad', 'here.', "I'm", 'mad.', "You're", "mad.'"] 

>>> import string 
>>> [word.strip(string.punctuation) for word in text.split()] 
['Oh', 'you', "can't", 'help', 'that', 'said', 'the', 'Cat', "we're", 'all', 'mad', 'here', "I'm", 'mad', "You're", 'mad'] 
+2

अच्छा, लेकिन कुछ अंग्रेजी शब्दों में वास्तव में पिछला विराम चिह्न होता है। उदाहरण के लिए, 'उदा।' और 'श्रीमती' में पिछला बिंदु, और 'मेंढक' (जैसे 'मेंढक' पैरों 'में पीछे) में पीछे के एस्ट्रोफ़े शब्द का हिस्सा हैं, लेकिन इस एल्गोरिदम द्वारा छीन लिया जाएगा। संक्षेप में संभालना सही ढंग से * विशेष रूप से डॉट-पृथक प्रारंभिकताओं का पता लगाकर * विशेष रूप से 'श्रीमान', 'श्रीमती') का उपयोग करके हासिल किया जा सकता है। सिंगल कोट्स से संबंधित एस्ट्रोफ़ेस को अलग करना नाटकीय रूप से कठिन है, क्योंकि इसमें वाक्य के व्याकरण को पार करने की आवश्यकता होती है जिसमें शब्द निहित है। –

+2

@ मार्कआमेरी आप सही हैं। यह तब भी हुआ जब मेरे पास कुछ विराम चिह्न-जैसे कि एम डैश-रिक्त स्थान के बिना शब्दों को अलग कर सकते हैं। –

+0

ओएमजी! मुझे पायथन पसंद है – Fandango68

10

shlex एक .split() समारोह है। यह में यह उद्धरण को संरक्षित नहीं है कि str.split() से अलग है और एक शब्द के रूप में एक उद्धृत वाक्यांश व्यवहार करता है:

>>> import shlex 
>>> shlex.split("sudo echo 'foo && bar'") 
['sudo', 'echo', 'foo && bar'] 
संबंधित मुद्दे