ডিকশনারির একটি লিস্ট থেকে নির্দিষ্ট মান যুক্ত ডিকশনারি সরানোর জন্য ইটারেশন, del অপারেটর এবং break স্টেটমেন্ট ব্যবহার করা হয়।
উদাহরণ
my_list = [
{"code": 1, "fun": "learn"},
{"code": 2, "fun": "code"},
{"code": 3, "fun": "test"},
{"code": 4, "fun": "teach"},
{"code": 4, "fun": "make"},
{"code": 4, "fun": "object"}
]
print("মূল লিস্ট:")
print(my_list)
# code == 3 হলে সেটি মুছে ফেলা
for i in range(len(my_list)):
if my_list[i]['code'] == 3:
del my_list[i]
break # প্রথম মিল পাওয়ার পর লুপ থেকে বের হওয়া
print("\nআপডেটেড লিস্ট:")
print(my_list)
আউটপুট
মূল লিস্ট:
[{'code': 1, 'fun': 'learn'}, {'code': 2, 'fun': 'code'}, {'code': 3, 'fun': 'test'}, {'code': 4, 'fun': 'teach'}, {'code': 4, 'fun': 'make'}, {'code': 4, 'fun': 'object'}]
আপডেটেড লিস্ট:
[{'code': 1, 'fun': 'learn'}, {'code': 2, 'fun': 'code'}, {'code': 4, 'fun': 'teach'}, {'code': 4, 'fun': 'make'}, {'code': 4, 'fun': 'object'}]
উন্নত ও পাইথনিক পদ্ধতি
লিস্ট কম্প্রিহেনশন বা filter() ব্যবহার করা ভালো, কারণ লিস্ট ইটারেট করার সময় ডিলিট করলে ইন্ডেক্স সমস্যা হয়:
# লিস্ট কম্প্রিহেনশন (সুপারিশকৃত)
filtered = [d for d in my_list if d['code'] != 3]
# অথবা filter()
filtered = list(filter(lambda d: d['code'] != 3, my_list))
# একাধিক শর্তের জন্য
filtered = [d for d in my_list if not (d['code'] == 3 and d['fun'] == 'test')]
কেন মূল পদ্ধতিটি সমস্যা?
for i in range(len(my_list))দিয়ে ইটারেট করেdelকরলে পরবর্তী ইন্ডেক্সগুলো শিফট করেbreakদিয়ে শুধু প্রথম মিলটি মুছে দেয় — সব মাচ করা আইটেম মুছে দিতে চাইলে এটি কাজ করবে না- লিস্ট কম্প্রিহেনশন নতুন লিস্ট তৈরি করে, মূল লিস্ট অপরিবর্তিত রাখে (ফাংশনাল স্টাইল)