जवाबों:
join
खाली स्ट्रिंग की विधि का उपयोग करके स्ट्रिंग के सभी को एक साथ बीच में खाली स्ट्रिंग के साथ जोड़ दें, जैसे:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
उद्धरणों के बीच एक जगह के साथ करते हैं
"".join(['a','b','c'])
मतलब है Join all elements of the array, separated by the string ""
। उसी तरह " hi ".join(["jim", "bob", "joe"])
से बनाएंगे "jim hi bob hi joe"
।
यह जावास्क्रिप्ट और रूबी जैसी कई लोकप्रिय भाषाओं में काम करता है, पायथन में क्यों नहीं?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
अजीब बात है, पायथन में join
विधि str
वर्ग पर है:
# this is the Python way
"".join(['a','b','c','d'])
जावास्क्रिप्ट या अन्य लोकप्रिय स्क्रिप्ट भाषाओं की तरह ऑब्जेक्ट join
में एक विधि क्यों नहीं है list
? यह एक उदाहरण है कि पायथन समुदाय कैसे सोचता है। चूंकि जुड़ाव एक स्ट्रिंग लौटा रहा है, इसे स्ट्रिंग वर्ग में रखा जाना चाहिए, सूची वर्ग पर नहीं, इसलिए str.join(list)
विधि का अर्थ है: str
एक विभाजक के रूप में उपयोग करके एक नई स्ट्रिंग में सूची में शामिल हों (इस मामले str
में एक खाली स्ट्रिंग है)।
किसी तरह सोचने के कुछ देर बाद मुझे इस तरह प्यार हो गया। मैं पायथन डिजाइन में बहुत सी चीजों के बारे में शिकायत कर सकता हूं, लेकिन इसके सुसंगतता के बारे में नहीं।
string.join()
सबसे अधिक संग्रह वाली join()
कई गतिशील भाषाओं में एक विधि से कर रहा था । पुनरावृत्तियों के बारे में, मुझे लगता है कि यह ऐसी भाषाओं के लिए कोई समस्या नहीं है क्योंकि यह संग्रह में कंस्ट्रक्टर और श्रृंखला में पुनरावृत्त को संलग्न करने के लिए उतना आसान (और सुगम्य) है join()
।
यदि आपका पायथन इंटरप्रेटर पुराना है (1.5.2, उदाहरण के लिए, जो कुछ पुराने लिनक्स वितरण पर आम है), तो आपके पास join()
किसी भी पुराने स्ट्रिंग ऑब्जेक्ट पर एक विधि के रूप में उपलब्ध नहीं हो सकता है , और आपको इसके बजाय स्ट्रिंग मॉड्यूल का उपयोग करने की आवश्यकता होगी। उदाहरण:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
तार b
होगा 'abcd'
।
यह सबसे तेज़ तरीका हो सकता है:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
अनावश्यक है, लेकिन जरूरतों में शामिल हों map(chr,a)
। यहाँ मेरा बेंचमार्क pastebin.com/1sKFm8ma है
''.join()
बहुत अधिक पठनीय है।
कम फ़ंक्शन भी काम करता है
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
या (apply + h)
काम करेगा। लेकिन फिर पायथन में, ऐड ऑपरेटर ठीक 2 ऑपरेंड लेता है, इसलिए कम करने की आवश्यकता होती है। अन्यथा, आप कर सकते हैं operator.add(*h)
, चूंकि apply
विस्तारित कॉल सिंटैक्स (उर्फ en.wikipedia.org/wiki/Variadic_function ) के पक्ष में आधिकारिक रूप से अजगर में पदावनत कर दिया गया है
सूची संख्या है, तो आप उपयोग कर सकते हैं map()
के साथ join()
।
उदाहरण के लिए:
>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
''.join([str(i) for i in arr])
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)
करना आपके एक-एक एपेंड विधि को दूर कर देगा।
इसके अलावा str.join
जो सबसे प्राकृतिक तरीका है, एक संभावना यह है कि सभी तत्वों को एक बार में लिखने के लिए उपयोग io.StringIO
और दुरुपयोग writelines
किया जाए:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
प्रिंट:
abcd
जनरेटर फ़ंक्शन या एक चलने योग्य के साथ इस दृष्टिकोण का उपयोग करते समय, जो एक tuple
या एक नहीं है list
, यह अस्थायी सूची निर्माण को बचाता है जो join
एक बार में सही आकार आवंटित करने के लिए करता है (और 1-वर्ण स्ट्रिंग्स की एक सूची बहुत महंगा मेमोरी-वार है )।
यदि आप स्मृति में कम हैं और आपके पास इनपुट के रूप में एक आलसी-मूल्यांकन की गई वस्तु है, तो यह दृष्टिकोण सबसे अच्छा समाधान है।
आप भी operator.concat()
इस तरह का उपयोग कर सकते हैं :
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
यदि आप पायथन 3 का उपयोग कर रहे हैं, तो आपको पहले से तैयारी करने की आवश्यकता है:
>>> from functools import reduce
चूंकि बिलियन reduce()
पायथन 3 से हटा दिया गया है और अब अंदर रहता है functools.reduce()
।