जवाबों:
चाहे वह डिक्शनरी में हो, एक कुंजी को हटाने के लिए, दो-तर्क फॉर्म का उपयोग करें dict.pop():
my_dict.pop('key', None)
my_dict[key]यदि keyशब्दकोश में मौजूद है, तो यह वापस आ जाएगा , और Noneअन्यथा। यदि दूसरा पैरामीटर निर्दिष्ट नहीं है (यानी। my_dict.pop('key')) और keyमौजूद नहीं है, तो एक KeyErrorउठाया जाता है।
मौजूद कुंजी को हटाने के लिए, आप उपयोग भी कर सकते हैं
del my_dict['key']
यह तब बढ़ेगा KeyErrorजब कुंजी शब्दकोश में नहीं होगी।
pop()ओवर का उपयोग करने का एक फायदा del: यह उस कुंजी के लिए मान लौटाता है। इस तरह आप कोड की एक पंक्ति में एक तानाशाह से प्रविष्टि प्राप्त कर सकते हैं और हटा सकते हैं।
try/ exceptसमाधान की तुलना में बहुत तेज है। आपको एक या दूसरा पढ़ने में आसान लग सकता है, जो ठीक है। दोनों मुहावरेदार पायथन हैं, इसलिए आप जो भी पसंद करते हैं उसे चुनें। लेकिन यह दावा करना कि यह उत्तर अधिक जटिल या अक्षम है, बस कोई मतलब नहीं है।
self, इसलिए यदि यह किया जाता है तो यह आश्चर्यजनक होगा।
विशेष रूप से जवाब देने के लिए "क्या ऐसा करने का एक तरीका है?"
if 'key' in my_dict: del my_dict['key']
... अच्छा, आपने पूछा ;-)
आप पर विचार करना चाहिए, हालांकि, कि एक से एक वस्तु को हटाने का इस तरह से dictहै परमाणु नहीं -यह कि संभव है 'key'में हो सकता है my_dictके दौरान ifबयान, लेकिन इससे पहले हटाया जा सकता है delनिष्पादित किया जाता है, जिसमें मामले delएक साथ विफल हो जाएगा KeyError। इसे देखते हुए, या तो उपयोगdict.pop करना सुरक्षित होगा या कुछ की तर्ज पर
try:
del my_dict['key']
except KeyError:
pass
जो, ज़ाहिर है, निश्चित रूप से है नहीं एक एक लाइनर।
popयह निश्चित रूप से अधिक संक्षिप्त है, हालांकि इस तरह से करने का एक महत्वपूर्ण लाभ है: यह तुरंत स्पष्ट है कि यह क्या कर रहा है।
try/exceptबयान ज्यादा महंगा है। अपवाद उठाना धीमा है।
tryतो थोड़ी तेजी से, हालांकि अगर यह नहीं है, तो यह tryवास्तव में एक अच्छा सौदा है। popसभी के मुकाबले काफी सुसंगत लेकिन धीमा है, लेकिन tryगैर-मौजूद कुंजी के साथ। Gist.github.com/zigg/6280653 देखें । अंत में, यह इस बात पर निर्भर करता है कि आप कितनी बार कुंजी की अपेक्षा करते हैं कि वह वास्तव में डिक्शनरी में हो, और आपको एटमॉसिटी की आवश्यकता है या नहीं - और निश्चित रूप से, आप समय से पहले अनुकूलन में संलग्न हैं या नहीं;)
if 'key' in mydict: #then del...। मुझे एक तानाशाही से सही ढंग से पार्स करने के लिए एक कुंजी / घाटी को बाहर निकालने की आवश्यकता थी, पॉप एक सही समाधान नहीं था।
मुझे यह पता लगाने में कुछ समय लगा कि वास्तव my_dict.pop("key", None)में क्या कर रहा है। इसलिए मैं इसे दूसरों के Googling समय को बचाने के जवाब के रूप में जोड़ूंगा:
pop(key[, default])यदि शब्दकोष में कुंजी है, तो उसे हटा दें और उसका मान लौटाएं, अन्यथा डिफ़ॉल्ट लौटें । यदि डिफ़ॉल्ट नहीं दिया गया है और कुंजी शब्दकोश में नहीं है, तो एक
KeyErrorउठाया जाता है।
dict.pop?आईपीथॉन में।
del my_dict[key]my_dict.pop(key)कुंजी मौजूद होने पर किसी शब्दकोश से कुंजी निकालने की तुलना में थोड़ा तेज़ होता है
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
लेकिन जब चाबी मौजूद नहीं होती है तो if key in my_dict: del my_dict[key]वह थोड़ी तेज होती है my_dict.pop(key, None)। दोनों की तुलना में कम से कम तीन गुना तेजी से कर रहे हैं delएक में try/ exceptबयान:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
popको बदल दिया है del। शब्दकोश बनाना पूरी तरह से इसे हटाने से बौना होगा।
delऔर popउपरोक्त समय के पहले सेट से)
यदि आपको कोड की एक पंक्ति में एक शब्दकोश से बहुत सी कुंजी निकालने की आवश्यकता है, तो मुझे लगता है कि मानचित्र का उपयोग करना () काफी रसीला है और पायथोनिक पठनीय है:
myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}
और अगर आपको त्रुटियों को पकड़ने की ज़रूरत है, जहां आप एक मूल्य पॉप करते हैं, जो शब्दकोश में नहीं है, तो नक्शे के अंदर लंबो का उपयोग करें () इस तरह:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
या python3, आपको इसके बजाय सूची बोध का उपयोग करना चाहिए:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]
यह काम करता हैं। और 'e' में त्रुटि नहीं हुई, जबकि myDict में 'e' कुंजी नहीं थी।
mapदोस्त अब आलसी हैं और पुनरावृत्तियों को लौटाते हैं। mapआमतौर पर साइड-इफेक्ट्स का उपयोग करना खराब अभ्यास माना जाता है; एक मानक for ... inलूप बेहतर होगा। देखें दृश्य और Iterators इसके बजाय की सूची में अधिक जानकारी के लिए।
[myDict.pop(i, None) for i in ['a', 'c']], क्योंकि वे map(और filter) के लिए एक सामान्य विकल्प प्रदान करते हैं ।
for ... inलूप का उपयोग करें ।
map(), जिसका उपयोग अक्सर इसके दुष्प्रभावों के लिए किया जाता है। अजगर में सिफारिश विकल्प है सूची समझ है, जो मेरी राय में अभी भी काफी पठनीय और एक एक लाइनर (प्रश्न देखें) के रूप में ज्ञान के लिहाज से हल्का है। केवल उनके दुष्प्रभावों के लिए उपयोग किया जाता है, दोनों निर्माण वास्तव में एक बेकार सूची में परिणाम करते हैं, जो अक्षम हो सकता है। Python3 के रूप में, मुझे एक अंतर्निहित फ़ंक्शन के बारे में पता नहीं है जो एक जनरेटर अभिव्यक्ति के माध्यम से सुरक्षित रूप से और सुरुचिपूर्ण ढंग से पुनरावृति कर सकता है, बिना महंगा बायप्रोडक्ट के loop(d.pop(k) for k in ['a', 'b'])।
आप उस कुंजी को हटाकर एक नया शब्दकोश बनाने के लिए एक शब्दकोश समझ का उपयोग कर सकते हैं :
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
आप शर्तों से हटा सकते हैं। कोई त्रुटि नहीं अगर keyमौजूद नहीं है।
"डेल" कीवर्ड का उपयोग करना:
del dict[key]
हम कुछ निम्नलिखित तरीकों से पायथन शब्दकोश से एक कुंजी को हटा सकते हैं।
delकीवर्ड का उपयोग करना ; यह लगभग वैसा ही दृष्टिकोण है जैसा आपने किया था -
myDict = {'one': 100, 'two': 200, 'three': 300 }
print(myDict) # {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : del myDict['one']
print(myDict) # {'two': 200, 'three': 300}
या
हम निम्नलिखित की तरह कर सकते हैं:
लेकिन एक को ध्यान में रखना चाहिए कि, इस प्रक्रिया में यह वास्तव में उस शब्दकोश से बाहर रखा विशिष्ट कुंजी बनाने के बजाय शब्दकोश से किसी भी कुंजी को नष्ट नहीं करेगा । इसके अलावा, मैंने देखा कि इसने एक शब्दकोश लौटाया जो कि जैसा था वैसा आदेश नहीं दिया गया ।myDict
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
यदि हम इसे शेल में चलाते हैं, तो यह कुछ ऐसा निष्पादित करेगा {'five': 500, 'four': 400, 'three': 300, 'two': 200}- ध्यान दें कि यह वैसा ही नहीं है जैसा आदेश दिया गया है myDict। फिर से अगर हम प्रिंट करने की कोशिश करते हैं myDict, तो हम उन सभी कुंजियों को देख सकते हैं जिनमें हमने इस दृष्टिकोण से शब्दकोश से बाहर रखा है। हालाँकि, हम निम्नलिखित कथन को एक चर में निर्दिष्ट करके एक नया शब्दकोश बना सकते हैं:
var = {key:value for key, value in myDict.items() if key != 'one'}
अब यदि हम इसे प्रिंट करने का प्रयास करते हैं, तो यह मूल आदेश का पालन करेगा:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
या
pop()विधि का उपयोग करना ।
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
के बीच अंतर है delऔर popयह है कि, pop()विधि का उपयोग करके , हम वास्तव में कुंजी के मूल्य को स्टोर कर सकते हैं यदि आवश्यक हो, तो निम्न की तरह:
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var) # 100
कांटा इस भविष्य में संदर्भ के लिए सार, तो आप इस उपयोगी पाते हैं।
if myDict.get('one')यदि कोई कुंजी मौजूद है, तो जांचने के लिए उपयोग न करें ! यह विफल रहता है अगर myDict ['एक'] का एक गलत मूल्य है। इसके अलावा, dicts में एक अंतर्निहित आदेश नहीं है, इसलिए इसका उल्लेख करने का कोई मतलब नहीं है।
यदि आप बहुत क्रियात्मक होना चाहते हैं तो आप अपवाद से निपटने का उपयोग कर सकते हैं:
try:
del dict[key]
except KeyError: pass
हालांकि, यह pop()विधि की तुलना में धीमी है, अगर कुंजी मौजूद नहीं है।
my_dict.pop('key', None)
यह कुछ चाबियों के लिए मायने नहीं रखेगा, लेकिन यदि आप इसे बार-बार कर रहे हैं, तो बाद का तरीका एक बेहतर शर्त है।
सबसे तेज़ तरीका यह है:
if 'key' in dict:
del myDict['key']
लेकिन यह विधि खतरनाक है क्योंकि अगर 'key'दो लाइनों के बीच में हटा दिया जाता है, तो एक KeyErrorउठाया जाएगा।
एक अन्य तरीका आइटम () + ताना बोध का उपयोग करके है
आइटम () तानाशाह की समझ के साथ मिलकर हमें कुंजी-मूल्य जोड़ी विलोपन के कार्य को प्राप्त करने में भी मदद कर सकते हैं, लेकिन, यह एक अयोग्य तानाशाही तकनीक नहीं होने का दोष है। वास्तव में अगर हम शामिल करने की इच्छा नहीं रखते हैं, तो एक नया ताना-बाना बनता है।
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
आउटपुट:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
यह
my_dictजगह में बदल जाएगा (परिवर्तनशील)
my_dict.pop('key', None)
एक नया श्रुत (अपरिवर्तनीय) उत्पन्न करें
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)