এর string.join(list)বদলে কেন list.join(string)?
এটি কারণ joinএকটি "স্ট্রিং" পদ্ধতি! এটি যে কোনও পুনরাবৃত্তীয় থেকে একটি স্ট্রিং তৈরি করে। যদি আমরা তালিকাগুলিতে পদ্ধতিটি আটকে থাকি, যখন আমাদের তালিকাগুলি তালিকাগুলি না থাকে তখন কী হবে?
আপনি যদি স্ট্রিং একটি tuple আছে? এটি যদি কোনও 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বিবিধ পুনরাবৃত্তের তুলনায় বস্তুটিতে থাকাটি এখনও বোধগম্য ।
-ঘোষণা করে যে আপনি একটি তালিকায় যোগ দিচ্ছেন এবং একটি স্ট্রিংয়ে রূপান্তর করছেন t এর ফলাফল ওরিয়েন্টেড।