2012-05-28 11 views
15

मुझे स्प्लिट फ़ंक्शन का उपयोग करने के बारे में कोई संदेह है।स्प्लिट फ़ंक्शन - अंतिम खाली स्थान से बचें

str = 'James;Joseph;Arun;' 
str.split(';') 

मैं परिणाम ['James', 'Joseph', 'Arun', '']

मिला मैं ['James', 'Joseph', 'Arun']

यह करने के लिए सबसे अच्छा तरीका क्या है के रूप में उत्पादन की जरूरत है?

+4

कृपया का उपयोग नहीं करते 'str' एक चर नाम के रूप में। यह अंतर्निहित 'str' छुपाता है। –

+0

@ मार्क बॉयर्स आपकी टिप्पणी के लिए धन्यवाद, मेरा वास्तविक var नाम अलग है। – Jisson

उत्तर

23

सभी रिक्त स्ट्रिंग को निकालने के लिए आप एक सूची समझ का उपयोग कर सकते हैं:

>>> [x for x in my_str.split(';') if x] 

या फिल्टर/bool चाल:

>>> filter(bool, my_str.split(';')) 

ध्यान दें कि यह भी शुरू में या में रिक्त स्ट्रिंग निकाल देंगे सूची के बीच, अंत में नहीं।

तुम सिर्फ अंत में रिक्त स्ट्रिंग आप बंटवारे से पहले rstrip का उपयोग कर सकते निकालना चाहते हैं।

>>> my_str.rstrip(';').split(';') 
+3

+1 अभी तक 'फिलर (बूल, एक्स)' के बारे में नहीं सुना था, केवल 'फ़िल्टर (कोई नहीं, एक्स) '। आपकी राय में कौन सा बेहतर है? – jamylak

+1

@jamylak: दोनों ठीक हैं। मैं 'फिल्टर (बूल, एक्स)' पसंद करता हूं क्योंकि यह अधिक स्पष्ट बनाता है कि यह क्यों काम करता है। एक फ़िल्टरिंग फ़ंक्शन के रूप में 'कोई नहीं' का उपयोग करना जादू की तरह लगता है (जब तक कि यह दस्तावेज नहीं पढ़ता है कि यह क्यों काम करता है)। लेकिन अन्य 'फ़िल्टर (कोई नहीं, एक्स)' पसंद करते हैं, इसलिए मुझे लगता है कि इससे कोई फर्क नहीं पड़ता है। –

16

पहले स्ट्रिंग के दाएं किनारे से ; निकालें:

s.rstrip(';').split(';') 

तुम भी filter() (जो बंद भी खाली तत्वों कि स्ट्रिंग के अंत में नहीं पाए गए फिल्टर करेगा) का उपयोग कर सकते । लेकिन उपरोक्त वास्तव में मेरी राय में सबसे साफ दृष्टिकोण है, जब आप अंत में खाली तत्व से बचना चाहते हैं, जिसके परिणामस्वरूप स्ट्रिंग के अंत में होने वाले वर्ण ";" होते हैं।

संपादित: असल में अधिक ऊपर से सही (जहां ऊपर अभी भी filter() का उपयोग करने से अधिक सटीक है) निम्नलिखित दृष्टिकोण है:

(s[:-1] if s.endswith(';') else s).split(';') 

यह केवल अंतिम तत्व निकाला जाएगा, और केवल अगर यह खाली बनाया जाएगा।

परीक्षण तीनों समाधान आप देखेंगे कि वे विभिन्न परिणाम देते हैं:

>>> def test_solution(solution): 
    cases = [ 
     'James;Joseph;Arun;', 
     'James;;Arun', 
     'James;Joseph;Arun', 
     ';James;Joseph;Arun', 
     'James;Joseph;;;', 
     ';;;', 
     ] 
    for case in cases: 
     print '%r => %r' % (case, solution(case)) 

>>> test_solution(lambda s: s.split(';')) # original solution 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun', ''] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph', '', '', ''] 
';;;' => ['', '', '', ''] 
>>> test_solution(lambda s: filter(bool, s.split(';'))) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph'] 
';;;' => [] 
>>> test_solution(lambda s: s.rstrip(';').split(';')) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph'] 
';;;' => [''] 
>>> test_solution(lambda s: (s[:-1] if s.endswith(';') else s).split(';')) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph', '', ''] 
';;;' => ['', '', ''] 
+0

सरल और प्रभावी –

+2

आईएमओ इसे 'rstrip' में बदल देता है क्योंकि उसने ** अंतिम ** खाली स्थान कहा था। – jamylak

+1

@jamylak: सही, जब आप अपनी टिप्पणी लिख रहे थे तो मैं उस जानकारी को जोड़ रहा हूं। कृपया अद्यतन उत्तर देखें। – Tadeck

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