স্ট্রিং লিস্ট থেকে যেসব স্ট্রিংয়ের ক্যারেক্টারগুলো ইতিমধ্যে সাজানো অবস্থায় আছে (অর্থাৎ স্ট্রিং == স্ট্রিংয়ের সাজানো ভার্সন), সেগুলো ফিল্টার করার জন্য sorted() এবং join() ব্যবহার করা হয়।
উদাহরণ
my_list = ["pyt", "Fdf", "Fun"]
print("লিস্ট:", my_list)
# ফিল্টার: স্ট্রিং == sorted(স্ট্রিং)
sorted_strings = [s for s in my_list if ''.join(sorted(s)) == s]
print("সাজানো স্ট্রিংগুলো:", sorted_strings)
আউটপুট
লিস্ট: ['pyt', 'Fdf', 'Fun']
সাজানো স্ট্রিংগুলো: ['Fdf']
ব্যাখ্যা
| স্ট্রিং | sorted(s) | join(sorted) | মিলে? |
|---|---|---|---|
| pyt | ['p', 't', 'y'] | pty | না (pyt ≠ pty) |
| Fdf | ['F', 'd', 'f'] | Fdf | হ্যাঁ (Fdf == Fdf) ✓ |
| Fun | ['F', 'n', 'u'] | Fnu | না (Fun ≠ Fnu) |
নোট: ASCII অর্ডারে বড় হাতের অক্ষর (Uppercase) ছোট হাতের (lowercase) থেকে আগে আসে। 'F' (70) < 'd' (100) < 'f' (102)।
কেস-ইনসেনসিটিভ সংস্করণ
sorted_strings = [
s for s in my_list
if ''.join(sorted(s.lower())) == s.lower()
]
# ['Fdf', 'Fun'] -- 'fun' সাজানো = 'fnu' ≠ 'fun', তবুও?
# 'fun'.lower() = 'fun', sorted = 'fnu' → না
# 'Fdf'.lower() = 'fdf', sorted = 'ddf' → না
কেস-ইনসেনসিটিভে 'Fdf'ও ভ্যালিড নয়। মূল লজিক কেস-সেনসিটিভ।
উন্নত: strictly increasing ক্যারেক্টার চেক
def is_sorted_string(s):
return all(s[i] <= s[i+1] for i in range(len(s)-1))
result = [s for s in my_list if is_sorted_string(s)]
# ['Fdf'] — F <= d <= f (ASCII: 70 <= 100 <= 102)
এটি sorted() কল ছাড়াই কাজ করে, O(n) টাইম।