2010-07-15 11 views
22

क्या स्ट्रिंग में प्रत्येक दूसरे तत्व में तत्व डालने का कोई पाइथनिक तरीका है?स्ट्रिंग में प्रत्येक 2 तत्वों को सम्मिलित करने के लिए पाइथोनिक तरीका

मेरे पास एक स्ट्रिंग है: 'aabbccdd' और मैं अंतिम परिणाम 'aa-bb-cc-dd' होना चाहता हूं।

मुझे यकीन नहीं है कि मैं ऐसा करने के बारे में कैसे जाऊंगा।

उत्तर

33

मान लें स्ट्रिंग की लंबाई हमेशा सम संख्या है,

>>> s = '12345678' 
>>> t = iter(s) 
>>> '-'.join(a+b for a,b in zip(t, t)) 
'12-34-56-78' 

t भी

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2])) 
'12-34-56-78' 

एल्गोरिथ्म जोड़े में स्ट्रिंग समूह के लिए है के साथ समाप्त किया जा सकता है, तो शामिल हो उन्हें - चरित्र के साथ।

कोड इस तरह लिखा गया है। सबसे पहले, यह विषम अंकों और यहां तक ​​कि अंकों में विभाजित है।

>>> s[::2], s[1::2] 
('1357', '2468') 

फिर the zip function उन्हें tuples के एक iterable में गठबंधन करने के लिए प्रयोग किया जाता है।

>>> list(zip(s[::2], s[1::2])) 
[('1', '2'), ('3', '4'), ('5', '6'), ('7', '8')] 

लेकिन टपल्स हम जो चाहते हैं वह नहीं हैं। यह तारों की एक सूची होनी चाहिए। यह

>>> [a+b for a,b in zip(s[::2], s[1::2])] 
['12', '34', '56', '78'] 

अंत में हम str.join() का उपयोग सूची गठबंधन करने के लिए सूची समझ का उद्देश्य है।

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2])) 
'12-34-56-78' 

कोड का पहला भाग एक ही विचार है, लेकिन स्ट्रिंग लंबा होने पर कम स्मृति का उपभोग करता है।

+1

क्या आप ज़िप भाग को समझा सकते हैं? वह क्या कर रहा है – root

+0

क्या होगा यदि लंबाई की लंबाई अजीब है? –

+0

@ हैम: आखिरी चरित्र चलेगा। – kennytm

29
>>> s = 'aabbccdd' 
>>> '-'.join(s[i:i+2] for i in range(0, len(s), 2)) 
'aa-bb-cc-dd' 
+2

अजीब लंबाई के अनुक्रमों के बारे में क्या? –

+3

मैं स्वीकृत उत्तर में ज़िप वूडू से अधिक पाइथोनिक मानता हूं। तथ्य यह है कि आपको पायथन में लूप के लिए रेंज (लेन (स्ट्रिंग)) का उपयोग करने की आवश्यकता नहीं है, इसका मतलब यह नहीं है कि किसी को इसे टालने के लिए पागल चीजों का आविष्कार करना होगा। – jsbueno

+2

@hamish: यह अंतिम चरित्र रखता है और इसके सामने एक हाइफ़न डालता है।क्या यह वांछित व्यवहार नहीं है? – SilentGhost

0

यह एक-लाइनर चाल करता है। यदि आपकी स्ट्रिंग में वर्णों की एक विषम संख्या है तो यह अंतिम वर्ण छोड़ देगा।

"-".join([''.join(item) for item in zip(mystring1[::2],mystring1[1::2])]) 
+0

मूक गॉस्ट का जवाब बेहतर है। लेकिन मुझे ज़िप करने की कोशिश करना पसंद आया ... – chryss

2

आप अगर स्ट्रिंग एक अजीब लंबाई है अंतिम वर्ण सुरक्षित रखना चाहते हैं, तो आप KennyTM के जवाब itertools.izip_longest उपयोग करने के लिए संशोधित कर सकते हैं:

>>> s = "aabbccd" 
>>> from itertools import izip_longest 
>>> '-'.join(a+b for a,b in izip_longest(s[::2], s[1::2], fillvalue="")) 
'aa-bb-cc-d' 

या

>>> t = iter(s) 
>>> '-'.join(a+b for a,b in izip_longest(t, t, fillvalue="")) 
'aa-bb-cc-d' 
0

यहाँ है गणना के मॉड्यूलस के आधार पर सशर्त मूल्य के साथ एक सूची समझने का तरीका, अजीब अंतिम चरित्र अकेले समूह में होगा:

for s in ['aabbccdd','aabbccdde']: 
    print(''.join([ char if not ind or ind % 2 else '-' + char 
        for ind,char in enumerate(s) 
        ] 
       ) 
     ) 
""" Output: 
aa-bb-cc-dd 
aa-bb-cc-dd-e 
""" 
संबंधित मुद्दे

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