এই টিউটোরিয়ালে, আমরা একটি প্রোগ্রাম লিখব যা একটি লিস্ট থেকে সব অ্যানাগ্রাম গ্রুপ করবে। প্রথমে দেখি অ্যানাগ্রাম কী।
যে কোনো দুটি স্ট্রিং যেগুলোর ক্যারেক্টার একই কিন্তু অর্ডার ভিন্ন, সেগুলোকে অ্যানাগ্রাম বলা হয়।
সমাধান শুরু করার আগে একটি উদাহরণ দেখা যাক।
ইনপুট
['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
আউটপুট
[['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]
আমরা সমস্যাটিকে দুটো টুকরোতে ভাগ করব। প্রথমে, আমরা একটি ফাংশন লিখব যা চেক করবে দুটি স্ট্রিং অ্যানাগ্রাম কিনা। নিচের ধাপগুলো অনুসরণ করুন অ্যানাগ্রাম চেক করার কোড লিখতে।
- স্ট্রিংগুলো ইনিশিয়ালাইজ করুন।
- দুটো স্ট্রিং সর্ট করুন।
- যদি দুটো সর্টেড স্ট্রিং সমান হয় তবে True রিটার্ন করুন অন্যথায় False।
উদাহরণ
# দুটি স্ট্রিং অ্যানাগ্রাম কিনা চেক করার সিম্পল ল্যাম্বডা ফাংশন
are_anagrams = lambda x, y: str(sorted(x.lower())) == str(sorted(y.lower()))
# ফাংশন কল
print(are_anagrams('cat', 'tac'))
print(are_anagrams('cat', 'Tac'))
print(are_anagrams('cat', 'dog'))
আউটপুট
যদি আপনি উপরের কোডটি রান করেন, তবে আপনি নিচের ফলাফল পাবেন।
True True False
এখন, আমরা জানি দুটি স্ট্রিং অ্যানাগ্রাম কিনা চেক করার উপায়। কিন্তু আমাদের সমস্যা সমাধানের জন্য এটাই যথেষ্ট নয়। আমাদের লিস্ট থেকে সব অ্যানাগ্রাম গ্রুপ (স্টোর) করতে হবে সাবলিস্ট আকারে।
সমস্যা কীভাবে সমাধান করব?
এটি একটি বেস্ট প্র্যাক্টিস যে ডিকশনারি ব্যবহার করে এলিমেন্টগুলো গ্রুপ করা হয়। রিলেটেড অ্যানাগ্রামের জন্য আমাদের একটি সিঙেল কি থাকবে। নовичে পাইথন প্রোগ্রামারদের জন্য একটু কনফিউজিং হতে পারে। চলুন আমরা যা চাই তা অর্জন করার ধাপগুলো দেখি।
- স্ট্রিংসহ লিস্ট ইনিশিয়ালাইজ করুন।
- একটি খালি ডিকশনারি ইনিশিয়ালাইজ করুন।
- লিস্টের ওপর ইটারেট করুন।
- স্ট্রিংটি সর্ট করুন।
- চেক করুন ডিকশনারিতে আছে কিনা।
- যদি ডিকশনারিতে থাকে, তবে স্ট্রিংটি তার লিস্টে অ্যাপেন্ড করুন।
- অন্যথায় করেন্ট স্ট্রিংসহ একটি লিস্ট দিয়ে কি ইনিশিয়ালাইজ করুন অ্যানাগ্রাম স্টোর করার জন্য।
- ডিকশনারির সব ভ্যালু লিস্ট আকারে প্রিন্ট করুন।
উদাহরণ
# স্ট্রিংসহ লিস্ট ইনিশিয়ালাইজ
anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
# খালি ডিক্ট ইনিশিয়ালাইজ
grouped_anagrams = {}
# লিস্টের ওপর ইটারেট করে সব অ্যানাগ্রাম গ্রুপ
for string in anagrams:
# স্ট্রিং সর্ট
sorted_string = str(sorted(string))
# ডিক্টে স্ট্রিং চেক
if sorted_string in grouped_anagrams:
# গ্রুপ অ্যানাগ্রামে স্ট্রিং যোগ
grouped_anagrams[sorted_string].append(string)
else:
# করেন্ট স্ট্রিংসহ একটি লিস্ট ইনিশিয়ালাইজ
grouped_anagrams[sorted_string] = [string]
# ডিক্টের ভ্যালুগুলো প্রিন্ট (অ্যানাগ্রাম গ্রুপ)
print(list(grouped_anagrams.values()))
আউটপুট
যদি আপনি উপরের কোডটি রান করেন, তবে আপনি নিচের ফলাফল পাবেন।
[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]
উপসংহার
আপনি ভিন্ন ভিন্ন অ্যাপ্রোচ দিয়েও সমস্যা সমাধান করতে পারেন। defaultdict নামে একটি ডেটা স্ট্রাকচার রয়েছে যা ডিকশনারিতে কি চেক করার ঝামেলা থেকে বাঁচায়। আপনি এক্সপ্লোর করে কোড পরিবর্তন করতে পারেন।
যদি টিউটোরিয়ালের বিষয়ে কোনো প্রশ্ন থাকে, তবে কমেন্ট সেকশনে জানান।