अक्षरों की सूची को एक स्ट्रिंग में बदलें


जवाबों:


585

joinखाली स्ट्रिंग की विधि का उपयोग करके स्ट्रिंग के सभी को एक साथ बीच में खाली स्ट्रिंग के साथ जोड़ दें, जैसे:

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'

1
मैं पात्रों के बीच रिक्त स्थान कैसे जोड़ सकता हूं? वैसे भी पूरी बात के माध्यम से पुनरावृत्ति के बिना यह करने के लिए?
clifgray

18
बस ' '.join(list)उद्धरणों के बीच एक जगह के साथ करते हैं
clifgray

इसके बारे में एक अच्छी बात यह है कि आप '\ n'.join (a) का उपयोग कर सकते हैं यदि आप प्रत्येक आइटम के लिए नई लाइनों के साथ txt के लिए एक सूची लिखना चाहते हैं
Norfeldt

28
स्पष्ट करने के लिए: का "".join(['a','b','c'])मतलब है Join all elements of the array, separated by the string ""। उसी तरह " hi ".join(["jim", "bob", "joe"])से बनाएंगे "jim hi bob hi joe"
जैक

39

यह जावास्क्रिप्ट और रूबी जैसी कई लोकप्रिय भाषाओं में काम करता है, पायथन में क्यों नहीं?

>>> ['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में एक खाली स्ट्रिंग है)।

किसी तरह सोचने के कुछ देर बाद मुझे इस तरह प्यार हो गया। मैं पायथन डिजाइन में बहुत सी चीजों के बारे में शिकायत कर सकता हूं, लेकिन इसके सुसंगतता के बारे में नहीं।


1
सूची विधि के बजाय एक स्ट्रिंग विधि में शामिल होने का मुख्य कारण यह है कि यह किसी सूची को ही नहीं बल्कि किसी भी पुनरावृत्ति को स्वीकार करता है । आप जनरेटर के भाव, शब्दकोश, सेट, विभिन्न प्रकार के विचारों का उपयोग कर सकते हैं, और इसी तरह। तो यह अधिकांश भाषाओं में ऑपरेशन में शामिल होने की तुलना में बहुत अधिक लचीला है।
रोजवू

मैं पायथन की तुलना string.join()सबसे अधिक संग्रह वाली join()कई गतिशील भाषाओं में एक विधि से कर रहा था । पुनरावृत्तियों के बारे में, मुझे लगता है कि यह ऐसी भाषाओं के लिए कोई समस्या नहीं है क्योंकि यह संग्रह में कंस्ट्रक्टर और श्रृंखला में पुनरावृत्त को संलग्न करने के लिए उतना आसान (और सुगम्य) है join()
पाउलो स्कार्डिन

हाँ, यह मानते हुए कि उनके पास या तो आलसी सूचियाँ (हास्केल शैली) हैं या आप सूची को शुरू करने से पहले याद में रखने में सहज हैं। मेरा कहना यह है कि पायथन का ऐसा करने का तरीका मनमाना नहीं है, इसका बहुत अच्छा औचित्य है।
रोजू

1
यह मनमाना नहीं है, यह हर वर्ग में नामस्थान प्रदूषण से बचने के लिए एक डिजाइन निर्णय है। :-)
पाउलो स्कर्दिन

बिल्कुल सही। इसके अलावा, उन सभी को भी वर्ग नहीं है - "चलने योग्य" एक प्रोटोकॉल है, एक वर्ग नहीं है। आप किसी भी चलने योग्य का उपयोग करके फ़िल्टर, मैप, जॉइन आदि कर सकते हैं।
रस्साकस १av

15

यदि आपका पायथन इंटरप्रेटर पुराना है (1.5.2, उदाहरण के लिए, जो कुछ पुराने लिनक्स वितरण पर आम है), तो आपके पास join()किसी भी पुराने स्ट्रिंग ऑब्जेक्ट पर एक विधि के रूप में उपलब्ध नहीं हो सकता है , और आपको इसके बजाय स्ट्रिंग मॉड्यूल का उपयोग करने की आवश्यकता होगी। उदाहरण:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

तार bहोगा 'abcd'


10

यह सबसे तेज़ तरीका हो सकता है:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@WinstonEwert हाँ, कल मैं एक ऐसा कार्यक्रम लिख रहा था जिसमें ऐसा करने की आवश्यकता थी, और मैंने अपने कार्यक्रम में इस पंक्ति के प्रदर्शन के लिए कुछ तरीके निर्धारित किए, परिणाम यह दिखाता है कि यह लगभग 20% तेजी से है''.join(['a','b','c'])
bigeagle

2
मेरा खुद का बेंचमार्क शो 7 गुना तेजी से जुड़ता है। pastebin.com/8nSc5Ek1 । आप अपने बेंचमार्क को साझा करने का मन बनाते हैं?
विंस्टन एवर्ट

1
@WinstonEwert आप सही हैं। मुझे इसका कारण मिल गया है: मेरे कार्यक्रम में मैंने नेटवर्क से इंट की एक सूची पुनः प्राप्त की, फिर स्ट्रिंग में कनवर्ट करें जहां map(ord,a)अनावश्यक है, लेकिन जरूरतों में शामिल हों map(chr,a)। यहाँ मेरा बेंचमार्क pastebin.com/1sKFm8ma है
bigeagle

15
समय से पहले अनुकूलन। यह पढ़ना और समझना इतना कठिन है कि क्या हो रहा है। जब तक उपयोगकर्ता ऑपरेशन में NEEDS प्रदर्शन नहीं करता है, एक साधारण ''.join()बहुत अधिक पठनीय है।
लुइज डेमिम

5
असहमत - प्रोग्रामर को ऐसी चीजों के लिए सबसे तेज़ तरीकों को ध्यान में रखने की आवश्यकता है। एक एकल सरल ऑपरेशन जो थोड़ी देर लेता है वह कोई बड़ी बात नहीं है। हालांकि, इस तरह से लिखे गए प्रत्येक कार्यक्रम के बारे में बताया गया है कि यह बहुत अधिक संसाधनों को फूला देता है। जब हम अपने आप को संभव के रूप में दुबला बनाने की आदत में नहीं डालते हैं, तो हम एक ऐसी दुनिया के साथ समाप्त होते हैं .... जैसे कि, विंडोज विस्टा, या लिनक्स में उपस्टार्ट कई छोटे शॉर्टकट के अच्छे उदाहरण हैं। 'ब्लोट एंड फ्लोट', जैसा कि पानी में मृत है। वे दोनों कुरूप भी हैं। str () का उपयोग क्यों नहीं करते हैं। (a) जो कि 100% अभिव्यंजक इम्हो है ..
osirisgothra

4

कम फ़ंक्शन भी काम करता है

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
यह हमेशा मुझे बताता है कि ऑपरेटर अपने आप में प्रथम श्रेणी के नागरिक नहीं हैं। उदाहरण के लिए, स्कीम में (+ h कम करें)
ब्रायन मिंटन

योजना में, (reduce + '' h)या (apply + h)काम करेगा। लेकिन फिर पायथन में, ऐड ऑपरेटर ठीक 2 ऑपरेंड लेता है, इसलिए कम करने की आवश्यकता होती है। अन्यथा, आप कर सकते हैं operator.add(*h), चूंकि applyविस्तारित कॉल सिंटैक्स (उर्फ en.wikipedia.org/wiki/Variadic_function ) के पक्ष में आधिकारिक रूप से अजगर में पदावनत कर दिया गया है
ब्रायन मिंटन

3

सूची संख्या है, तो आप उपयोग कर सकते हैं map()के साथ join()

उदाहरण के लिए:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

यह वास्तव में अधिक ''.join([str(i) for i in arr])
पायथोनिक

@ user1767754 खैर, गुइडो उस शैली को पसंद करते हैं, लेकिन मानचित्र फ़ंक्शन का उपयोग करने में कुछ भी गलत नहीं है।
इसका सेबर

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
यह काफी धीमा होगा। का उपयोग ''.join(h)करना आपके एक-एक एपेंड विधि को दूर कर देगा।
मार्टिन पीटर्स

1
'इन द पायथॉन बाईबल (वह 1400+ पेज एक), कई जगहों पर यह बताता है कि ऐसा करना गलत है और जब भी संभव हो इससे बचा जाना चाहिए। यह भी बिन बुलाए अजगर शुरुआत का एक स्पष्ट रूप से स्पष्ट ट्रेडमार्क है (कार्यक्षमता का अपमान नहीं करने के लिए ... अच्छी तरह से) यह काम कर सकता है लेकिन आप इसे करने के लिए लगभग 5000 लोगों से "ऐसा नहीं करेंगे" सुनेंगे।
ओसीरसिगोत्रा

2

इसके अलावा 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-वर्ण स्ट्रिंग्स की एक सूची बहुत महंगा मेमोरी-वार है )।

यदि आप स्मृति में कम हैं और आपके पास इनपुट के रूप में एक आलसी-मूल्यांकन की गई वस्तु है, तो यह दृष्टिकोण सबसे अच्छा समाधान है।


0

आप भी operator.concat()इस तरह का उपयोग कर सकते हैं :

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

यदि आप पायथन 3 का उपयोग कर रहे हैं, तो आपको पहले से तैयारी करने की आवश्यकता है:

>>> from functools import reduce

चूंकि बिलियन reduce()पायथन 3 से हटा दिया गया है और अब अंदर रहता है functools.reduce()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.