2012-06-12 15 views
10

मैं इस तरह एक concatenated स्ट्रिंग है:तरह से रिक्त स्ट्रिंग

my_str = 'str1;str2;str3;' 

और मैं इसे करने के लिए split समारोह लागू करने के लिए और फिर एक के परिणामस्वरूप सूची रूपांतरित होते हैं टपल, और किसी भी रिक्त स्ट्रिंग से छुटकारा पाने के split से हुई (नोटिस पिछले ';' अंत में)

अब तक, मैं यह कर रहा हूं:

tuple(filter(None, my_str.split(';'))) 

क्या कोई और कुशल (गति और स्थान के मामले में) इसे करने का तरीका है?

+0

@Levon, बिंदु लिया, माफ करना, मैं सिर्फ एक उदाहरण चर नाम जल्दी में उठाया कोशिश करो। धन्यवाद। – MLister

+1

कृपया बताएं कि "बेहतर" से आपका क्या मतलब है। – NPE

+0

1. खाली खंड केवल अंत में अतिरिक्त ';' के कारण हो सकते हैं, या सूची के मध्य में खाली तार हो सकते हैं? 2. आप परिणाम को टुपल में क्यों बदलना चाहते हैं? आमतौर पर, 'str.split()' द्वारा लौटाई गई सूची का उपयोग करके ठीक करना चाहिए। –

उत्तर

7

यह करने का एक बहुत ही उचित तरीका है। कुछ विकल्प:

  • foo.strip(";").split(";") (अगर वहाँ स्ट्रिंग के अंदर किसी भी खाली स्लाइस नहीं होगा)
  • [ x.strip() for x in foo.split(";") if x.strip() ]

"सबसे तेज" तरीका यह है (प्रत्येक टुकड़ा से खाली स्थान के पट्टी) बहुत कुछ इस पर निर्भर करेगा ... लेकिन आप आसानी से IPython के %timeit के साथ प्रयोग कर सकते हैं:

 
In [1]: foo = "1;2;3;4;" 

In [2]: %timeit foo.strip(";").split(";") 
1000000 loops, best of 3: 1.03 us per loop 

In [3]: %timeit filter(None, foo.split(';')) 
1000000 loops, best of 3: 1.55 us per loop 
+0

यदि यह केवल ';' का पीछा करने के बारे में है, तो आप 'str.rstrip()' का भी उपयोग कर सकते हैं। –

+0

यूप, निश्चित रूप से। 'स्ट्रिप' उन्हें दोनों सिरों से हटा देगा। –

1

उपयोग विभाजन और उसके बाद slici एनजी:

my_str.split(';')[:-1] 

या:

lis=[x for x in my_str.split(';') if x] 
+0

मुझे लगता है कि ओपी परिणाम के रूप में एक tuple चाहता है, एक सूची नहीं – Levon

2

हाँ, कि यह करने के लिए काफी pythonic तरीका है। आप जनरेटर भाव के लिए एक प्यार है, तो आप भी बदल सकते साथ filter():

tuple(part for part in my_str.split(';') if part) 

यह इन-लाइन प्रत्येक भाग पर आगे की प्रक्रिया के लिए अनुमति देने का लाभ है।

यह ध्यान रखें कि str.split() के लिए दस्तावेज़ कहते हैं दिलचस्प है:

... Sep तय नहीं है तो या कोई नहीं है, कोई श्वेत रिक्ति स्ट्रिंग एक विभाजक है और रिक्त स्ट्रिंग परिणाम से निकाल दिए जाते ।

मुझे आश्चर्य है कि क्यों इस विशेष मामले में यह अन्य विभाजक के लिए अनुमति के बिना किया गया था ...

4

आप केवल अंत में एक खाली स्ट्रिंग उम्मीद हैं, तो आप कर सकते हैं:

a = 'str1;str2;str3;' 
tuple(a.split(';')[:-1]) 

या

tuple(a[:-1].split(';')) 
8

इस बारे में कैसे?

tuple(my_str.split(';')[:-1]) 
    ('str1', 'str2', 'str3') 

आप ; चरित्र पर स्ट्रिंग विभाजित है, और सभी बंद परिणाम टपल को बनाने के लिए टपल के लिए (पिछले एक, खाली स्ट्रिंग को छोड़कर) सबस्ट्रिंग पारित।

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