बहुत सारे अच्छे जवाब हैं, लेकिन मैं एक बात पर जोर देना चाहता हूं।
शब्दकोश से आइटम निकालने के लिए आप 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()
, पर्याप्त हो सकती है। शब्दकोश एक कुंजी के लिए एक मूल्य के रूप में वस्तु के लिए एक संदर्भ रखता है। इसलिए जब आप किसी शब्दकोश से एक कुंजी निकालते हैं तो यह संदर्भ हटा दिया जाता है, न कि ऑब्जेक्ट को संदर्भित किया जा रहा है। मेमोरी कलेक्टर द्वारा ऑब्जेक्ट को बाद में स्वचालित रूप से हटा दिया जा सकता है, अगर मेमोरी में इसके लिए कोई अन्य संदर्भ नहीं हैं। एक गहरी प्रतिलिपि बनाने के लिए उथले प्रति की तुलना में अधिक गणनाओं की आवश्यकता होती है, इसलिए यह प्रतिलिपि बनाने, मेमोरी को बर्बाद करने और जीसी को अधिक काम प्रदान करने के लिए कोड के प्रदर्शन को कम करता है, कभी-कभी उथली प्रतिलिपि पर्याप्त होती है।
हालाँकि, यदि आपके पास शब्दकोश मूल्यों के रूप में उत्परिवर्तित वस्तुएं हैं और बाद में कुंजी के बिना वापस लौटाए गए शब्दकोश में उन्हें संशोधित करने की योजना है, तो आपको एक गहरी प्रतिलिपि बनाना होगा।
उथली प्रति के साथ:
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}