সমস্যা
আপনি একটি ডিকশনারি ডেটার ওপর বিভিন্ন ক্যালকুলেশন (ন্যূনতম, সর্বোচ্চ, সর্টিং ইত্যাদি) করতে চান।
সমাধান
টেনিস খেলোয়াড় এবং তাদের গ্র্যান্ডسلام টাইটেল দিয়ে একটি ডিকশনারি তৈরি করি।
PlayerTitles = {
'Federer': 20,
'Nadal': 20,
'Djokovic': 17,
'Murray': 3,
'Theim': 1,
'Zverev': 0
}
১. ন্যূনতম মান বের করা (ভুল পদ্ধতি)
min(PlayerTitles) # 'Djokovic' ফেরত দেবে (অ্যালফাবেটিক্যালি ন্যূনতম কী)
২. values() ব্যবহার করে ন্যূনতম মান
min(PlayerTitles.values()) # 0 ফেরত দেবে
৩. কীসহ ন্যূনতম/সর্বোচ্চ
min(PlayerTitles, key=lambda k: PlayerTitles[k]) # 'Zverev'
PlayerTitles[min(PlayerTitles, key=lambda k: PlayerTitles[k])] # 0
৪. zip() ব্যবহার করে (বেস্ট প্র্যাকটিস)
zip() দিয়ে (value, key) পেয়ার বানালে তুলনা সঠিক হয়।
min_titles = min(zip(PlayerTitles.values(), PlayerTitles.keys()))
max_titles = max(zip(PlayerTitles.values(), PlayerTitles.keys()))
print(min_titles, max_titles) # ((0, 'Zverev'), (20, 'Nadal'))
৫. সর্টিং
titles_sorted = sorted(zip(PlayerTitles.values(), PlayerTitles.keys()))
# [(0, 'Zverev'), (1, 'Theim'), (3, 'Murray'), (17, 'Djokovic'), (20, 'Federer'), (20, 'Nadal')]
৬. zip() ইটারেটর একবারই কনজিউম করা যায়
দ্বিতীয়বার কল করলে Empty sequence এরর দেবে।
৭. ডুপ্লিকেট ভ্যালুর ক্ষেত্রে কী ব্যবহার হয়
যদি একাধিক এন্ট্রি একই ভ্যালু দিয়ে থাকে, min()/max()-এ সবচেয়ে ছোট/বড় কী ফেরত দেয়। তাই ২০ টাইটেল থাকা সত্ত্বেও শুধু 'Nadal' ফেরত দিয়েছে।