इसके string.join(list)
बजाय क्यों है list.join(string)
?
ऐसा इसलिए है क्योंकि join
एक "स्ट्रिंग" विधि है! यह किसी भी चलने योग्य से एक स्ट्रिंग बनाता है। यदि हम सूचियों पर विधि अटक जाते हैं, तो क्या होगा जब हमारे पास पुनरावृत्तियाँ हैं जो सूचियाँ नहीं हैं?
क्या होगा यदि आपके पास तार का एक टुकड़ा है? यदि यह एक list
विधि थी, तो आपको स्ट्रिंग्स के प्रत्येक ऐसे पुनरावृत्तिकर्ता को list
पहले लाना होगा क्योंकि आप तत्वों को एक स्ट्रिंग में शामिल कर सकते हैं! उदाहरण के लिए:
some_strings = ('foo', 'bar', 'baz')
आइए हम अपनी सूची में शामिल होने की विधि को रोल करें:
class OurList(list):
def join(self, s):
return s.join(self)
और इसका उपयोग करने के लिए, ध्यान दें कि हमें सबसे पहले प्रत्येक पुनरावृत्ति से एक सूची बनानी होगी जो उस पुनरावृत्ति में तार जुड़ने के लिए स्मृति और प्रसंस्करण शक्ति दोनों को बर्बाद कर दे:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
इसलिए हम देखते हैं कि हमें अपनी सूची विधि का उपयोग करने के लिए एक अतिरिक्त कदम जोड़ना होगा, बजाय केवल अंतर्निहित स्ट्रिंग विधि का उपयोग करने के लिए:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
जेनरेटर के लिए प्रदर्शन कैवेट
एल्गोरिथ्म पाइथन अंतिम स्ट्रिंग बनाने के लिए उपयोग करता है जिसके साथ str.join
वास्तव में दो बार से अधिक चलना पड़ता है, इसलिए यदि आप इसे जनरेटर अभिव्यक्ति प्रदान करते हैं, तो इसे अंतिम स्ट्रिंग बनाने से पहले इसे पहले सूची में बदलना होगा।
इस प्रकार, जेनरेटरों के आसपास से गुजरना आमतौर पर सूची की समझ से बेहतर है, str.join
एक अपवाद है:
>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173
फिर भी, str.join
ऑपरेशन अभी भी शब्दशः एक "स्ट्रिंग" ऑपरेशन है, इसलिए यह अभी भी यह है कि यह str
वस्तु पर विविध iterables की तुलना में है।
-
घोषणा करता है कि आप एक सूची में शामिल हो रहे हैं और एक स्ट्रिंग में परिवर्तित कर रहे हैं। यह परिणाम उन्मुख है।