অনেক সুন্দর উত্তর আছে, তবে আমি একটি বিষয়ে জোর দিতে চাই।
অভিধান থেকে আইটেমগুলি সরাতে আপনি দুটি dict.pop()
পদ্ধতি এবং আরও জেনেরিক del
বিবৃতি ব্যবহার করতে পারেন । তারা উভয়ই মূল অভিধানটি পরিবর্তন করে, তাই আপনাকে একটি অনুলিপি তৈরি করতে হবে (নীচে বিশদটি দেখুন)।
KeyError
আপনি তাদের যে কীটি সরবরাহ করছেন তা অভিধানে উপস্থিত না থাকলে উভয়ই এই উত্থাপন করবে :
key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove] # Raises `KeyError: 'c'`
এবং
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove) # Raises `KeyError: 'c'`
আপনার এটি যত্ন নিতে হবে:
ব্যতিক্রম ক্যাপচার দ্বারা:
key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
del d[key_to_remove]
except KeyError as ex:
print("No such key: '%s'" % ex.message)
এবং
key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
d.pop(key_to_remove)
except KeyError as ex:
print("No such key: '%s'" % ex.message)
একটি পরীক্ষা করে:
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
del d[key_to_remove]
এবং
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
d.pop(key_to_remove)
তবে এর সাথে pop()
আরও অনেক সংক্ষিপ্ত উপায় রয়েছে - ডিফল্ট রিটার্ন মান সরবরাহ করুন:
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None) # No `KeyError` here
আপনি যদি pop()
কোনও কীটি সরিয়ে ফেলার মান পেতে ব্যবহার না করেন তবে আপনি কিছু সরবরাহ করতে পারেন, প্রয়োজনীয় নয় None
। যদিও এটি হতে পারে যে চেক del
দিয়ে ব্যবহার করা তার নিজস্ব জটিলতাগুলির সাথে একটি ক্রিয়াকলাপ হওয়ার কারণে ওভারহেডের কারণে সামান্য দ্রুত হয় । সাধারণত এটি ক্ষেত্রে হয় না, তাই ডিফল্ট মান সহ যথেষ্ট ভাল।in
pop()
pop()
মূল প্রশ্নটি হিসাবে, আপনাকে মূল অভিধানটি সংরক্ষণ করতে আপনার অভিধানের একটি অনুলিপি তৈরি করতে হবে এবং কীটি অপসারণ না করে একটি নতুন আছে।
অন্য কিছু লোক এখানে একটি সম্পূর্ণ (গভীর) অনুলিপি তৈরি করার পরামর্শ দিয়েছেন copy.deepcopy()
, যা ওভারকিল হতে পারে, একটি "সাধারণ" (অগভীর) অনুলিপি ব্যবহার করে copy.copy()
বা dict.copy()
যথেষ্ট হতে পারে। অভিধানটি কীটির মান হিসাবে বস্তুর রেফারেন্স রাখে। সুতরাং আপনি যখন কোনও অভিধান থেকে একটি কী সরিয়ে ফেলেন তখন এই রেফারেন্সটি সরিয়ে ফেলা হয়, অবজেক্টটি রেফারেন্স করা হয় না। মেমরিটিতে এর জন্য অন্য কোনও রেফারেন্স না থাকলে অবজেক্টটি নিজেই পরে আবর্জনা সংগ্রহকারী দ্বারা স্বয়ংক্রিয়ভাবে মুছে ফেলা হতে পারে। অগভীর অনুলিপিটির তুলনায় একটি গভীর অনুলিপি তৈরির জন্য আরও বেশি গণনা প্রয়োজন, সুতরাং এটি অনুলিপি তৈরি করে, মেমরি নষ্ট করে এবং জিসিকে আরও কাজ সরবরাহ করে কোডের কার্যকারিতা হ্রাস করে, কখনও কখনও অগভীর অনুলিপি যথেষ্ট is
তবে, যদি আপনার অভিধানের মান হিসাবে পরিবর্তনীয় অবজেক্ট থাকে এবং কী ছাড়াই প্রত্যাবর্তিত অভিধানে পরে এগুলি সংশোধন করার পরিকল্পনা করেন, আপনাকে একটি গভীর অনুলিপি তৈরি করতে হবে।
অগভীর অনুলিপি সহ:
def get_dict_wo_key(dictionary, key):
"""Returns a **shallow** copy of the dictionary without a key."""
_dict = dictionary.copy()
_dict.pop(key, None)
return _dict
d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"
new_d = get_dict_wo_key(d, key_to_remove)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d) # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d) # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2222}
গভীর অনুলিপি সহ:
from copy import deepcopy
def get_dict_wo_key(dictionary, key):
"""Returns a **deep** copy of the dictionary without a key."""
_dict = deepcopy(dictionary)
_dict.pop(key, None)
return _dict
d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"
new_d = get_dict_wo_key(d, key_to_remove)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2222}