সমস্যা
অস্তিত্বহীন কী দিয়ে ডিকশনারি এক্সেস করলে KeyError excepción উঠে।
d = {'India': 'IN', 'Australia': 'AU', 'Brazil': 'BR'}
print(d['Canada']) # KeyError: 'Canada'
সমাধান ১: get() মেথড (সুপারিশকৃত)
d = {'India': 'IN', 'Australia': 'AU', 'Brazil': 'BR'}
print(d.get('Australia')) # 'AU'
print(d.get('Canada')) # None (ডিফল্ট)
print(d.get('Canada', 'Not Found')) # 'Not Found' (কাস্টম ডিফল্ট)
- কী থাকলে ভ্যালু রিটার্ন, নাইলে ডিফল্ট (None বা ইউজার-ডিফাইনড) রিটার্ন।
- ডিকশনারি পরিবর্তন হয় না।
সমাধান ২: setdefault() মেথড
d = {'India': 'IN', 'Australia': 'AU', 'Brazil': 'BR'}
# কী না থাকলে ডিফল্ট ভ্যালু সেট করে দেয়
value = d.setdefault('Canada', 'Not Present')
print(value) # 'Not Present'
print(d['Canada']) # 'Not Present' (ডিকশনারিতে যোগ হয়েছে)
get()-এর মতো, কিন্তু কী না থাকলে ডিকশনারিতে যোগ করে দেয়।
- ডিফল্ট ভ্যালু মিউটেবল (লিস্ট/ডিক্ট) হলে সতর্ক থাকুন — একই অবজেক্ট শেয়ার হবে।
সমাধান ৩: defaultdict (collections মডিউল)
from collections import defaultdict
# ডিফল্ট ফ্যাক্টরি: ল্যাম্বডা বা টাইপ
d = defaultdict(lambda: 'Key Not Present')
d['India'] = 'IN'
d['Australia'] = 'AU'
print(d['Australia']) # 'AU'
print(d['Canada']) # 'Key Not Present' (অটোমেটিক্যালি যোগ হয়েছে)
print(dict(d)) # {'India': 'IN', 'Australia': 'AU', 'Canada': 'Key Not Present'}
সাধারণ ডিফল্ট ফ্যাক্টরি
| ফ্যাক্টরি | ডিফল্ট ভ্যালু | ব্যবহার |
int | 0 | কাউন্টিং |
list | [] | গ্রুপিং/অ্যাকামুলেশন |
set | set() | ইউনিক সংগ্রহ |
lambda: default_val | কাস্টম | যেকোনো ডিফল্ট |
সমাধান ৪: try/except ব্লক
d = {'India': 'IN', 'Australia': 'AU', 'Brazil': 'BR'}
try:
value = d['Canada']
except KeyError:
value = 'Not Found'
# অথবা d['Canada'] = 'Not Found' # সেট করতে চাইলে
print(value)
EAFP (Easier to Ask Forgiveness than Permission) স্টাইল — পাইথনিক।
তুলনা টেবিল
| পদ্ধতি | কী না থাকলে | ডিক্ট পরিবর্তন | ব্যবহার কেস |
get(key, default) | default রিটার্ন | না | সাধারণ লুকআপ (সর্বাধিক ব্যবহৃত) |
setdefault(key, default) | default সেট+রিটার্ন | হ্যাঁ | ক্যাশিং, ইনিশিয়ালাইজেশন |
defaultdict(factory) | factory() কল করে ভ্যালু বানায় | হ্যাঁ | গ্রুপিং, কাউন্টিং, নেস্টেড ডিক্ট |
try/except KeyError | এক্সেপশন হ্যান্ডল | অপশনাল | জটিল লজিক, EAFP স্টাইল |
key in dict | Boolean চেক | না | পূর্বে চেক করলে (LBYL) |