जवाबों:
चाहे वह डिक्शनरी में हो, एक कुंजी को हटाने के लिए, दो-तर्क फॉर्म का उपयोग करें 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()
)
)
)