पायथन शब्दकोश से एक कुंजी कैसे निकालें?


1762

शब्दकोश से एक कुंजी को हटाने पर, मैं उपयोग करता हूं:

if 'key' in my_dict:
    del my_dict['key']

क्या ऐसा करने का एक तरीका है?


24
इस प्रश्न के उत्तर में प्रस्तावित विभिन्न तरीकों के लिए बेंचमार्क स्क्रिप्ट: gist.github.com/zigg/6280653
zigg

जवाबों:


2833

चाहे वह डिक्शनरी में हो, एक कुंजी को हटाने के लिए, दो-तर्क फॉर्म का उपयोग करें dict.pop():

my_dict.pop('key', None)

my_dict[key]यदि keyशब्दकोश में मौजूद है, तो यह वापस आ जाएगा , और Noneअन्यथा। यदि दूसरा पैरामीटर निर्दिष्ट नहीं है (यानी। my_dict.pop('key')) और keyमौजूद नहीं है, तो एक KeyErrorउठाया जाता है।

मौजूद कुंजी को हटाने के लिए, आप उपयोग भी कर सकते हैं

del my_dict['key']

यह तब बढ़ेगा KeyErrorजब कुंजी शब्दकोश में नहीं होगी।


152
कभी-कभी pop()ओवर का उपयोग करने का एक फायदा del: यह उस कुंजी के लिए मान लौटाता है। इस तरह आप कोड की एक पंक्ति में एक तानाशाह से प्रविष्टि प्राप्त कर सकते हैं और हटा सकते हैं।
क्रतेंको

7
प्रश्न में मान रखने की आवश्यकता नहीं है। यह केवल अनावश्यक जटिलता को जोड़ देगा। @ ज़िग (नीचे) से उत्तर बहुत बेहतर है।
साल्वाटोर कोसेंटिनो

10
@SalvatoreCosentino मैं आपके तर्क का पालन नहीं कर सकता। इस उत्तर में कोड अन्य उत्तर के कोड की तुलना में अधिक जटिल कैसे है?
स्वेन मार्नाच

33
@SalvatoreCosentino नहीं, किसी फ़ंक्शन के रिटर्न मान को अनदेखा करना बिल्कुल भी अक्षम नहीं है। इसके विपरीत - यदि कुंजी मौजूद नहीं है, तो यह समाधान try/ exceptसमाधान की तुलना में बहुत तेज है। आपको एक या दूसरा पढ़ने में आसान लग सकता है, जो ठीक है। दोनों मुहावरेदार पायथन हैं, इसलिए आप जो भी पसंद करते हैं उसे चुनें। लेकिन यह दावा करना कि यह उत्तर अधिक जटिल या अक्षम है, बस कोई मतलब नहीं है।
स्वेन मार्नाच

5
@ user5359531 मुझे समझ नहीं आ रहा है। यह कैसी समस्या है? पायथन के अंतर्निहित प्रकारों में से कोई भी तरीका रिटर्न नहीं करता है self, इसलिए यदि यह किया जाता है तो यह आश्चर्यजनक होगा।
स्वेन मार्नाच

352

विशेष रूप से जवाब देने के लिए "क्या ऐसा करने का एक तरीका है?"

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

जो, ज़ाहिर है, निश्चित रूप से है नहीं एक एक लाइनर।


27
हाँ, popयह निश्चित रूप से अधिक संक्षिप्त है, हालांकि इस तरह से करने का एक महत्वपूर्ण लाभ है: यह तुरंत स्पष्ट है कि यह क्या कर रहा है।
जिग

4
try/exceptबयान ज्यादा महंगा है। अपवाद उठाना धीमा है।
क्रिस बार्कर

16
@ChrisBarker मैंने पाया है कि यदि कुंजी मौजूद है, tryतो थोड़ी तेजी से, हालांकि अगर यह नहीं है, तो यह tryवास्तव में एक अच्छा सौदा है। popसभी के मुकाबले काफी सुसंगत लेकिन धीमा है, लेकिन tryगैर-मौजूद कुंजी के साथ। Gist.github.com/zigg/6280653 देखें । अंत में, यह इस बात पर निर्भर करता है कि आप कितनी बार कुंजी की अपेक्षा करते हैं कि वह वास्तव में डिक्शनरी में हो, और आपको एटमॉसिटी की आवश्यकता है या नहीं - और निश्चित रूप से, आप समय से पहले अनुकूलन में संलग्न हैं या नहीं;)
zigg

9
मेरा मानना ​​है कि स्पष्टता के मूल्य की अनदेखी नहीं की जानी चाहिए। इसके लिए +1।
जुआन कार्लोस कोटो

2
कोशिश / छोड़कर खर्च के संबंध में, आप भी जा सकते हैं if 'key' in mydict: #then del...। मुझे एक तानाशाही से सही ढंग से पार्स करने के लिए एक कुंजी / घाटी को बाहर निकालने की आवश्यकता थी, पॉप एक सही समाधान नहीं था।
मार्क

152

मुझे यह पता लगाने में कुछ समय लगा कि वास्तव my_dict.pop("key", None)में क्या कर रहा है। इसलिए मैं इसे दूसरों के Googling समय को बचाने के जवाब के रूप में जोड़ूंगा:

pop(key[, default])

यदि शब्दकोष में कुंजी है, तो उसे हटा दें और उसका मान लौटाएं, अन्यथा डिफ़ॉल्ट लौटें । यदि डिफ़ॉल्ट नहीं दिया गया है और कुंजी शब्दकोश में नहीं है, तो एक KeyErrorउठाया जाता है।

प्रलेखन


15
अजगर इंटरप्रेटर में बस मदद (ताना.पॉप) टाइप करें।
डेविड मुल्डर

13
मदद () और दिर () आपके दोस्त हो सकते हैं जब आपको यह जानना होगा कि कुछ क्या करता है।
डेविड मुल्डर

3
या dict.pop?आईपीथॉन में।
एरिक कपलुन

50

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

1
इस तरह के एक त्वरित ऑपरेशन के समय को मापना बहुत ही मूर्खतापूर्ण है। आपका कोड संभवतः बहुत तेज़ नहीं होने वाला है क्योंकि आपने a popको बदल दिया है del। शब्दकोश बनाना पूरी तरह से इसे हटाने से बौना होगा।
बोरिस

1
@ बोरिस - यह एक सामान्य व्यायाम के रूप में उपयोगी है।
डेज़ी

1
@ डेज़ी मैं जो कह रहा हूं वह यह है कि आपको सबसे अधिक पठनीय वाक्य-विन्यास चुनना चाहिए न कि वह ऑपरेशन जो 300 नैनोसेकंड तेज़ी से हो (जो कि वस्तुतः अंतर delऔर popउपरोक्त समय के पहले सेट से)
बोरिस

इसके अलावा ये ऑपरेशन इतने तेज़ हैं कि ये समय विश्वसनीय नहीं हैं।
बोरिस

45

यदि आपको कोड की एक पंक्ति में एक शब्दकोश से बहुत सी कुंजी निकालने की आवश्यकता है, तो मुझे लगता है कि मानचित्र का उपयोग करना () काफी रसीला है और पायथोनिक पठनीय है:

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' कुंजी नहीं थी।


42
यह पायथन 3 में काम नहीं करेगा क्योंकि mapदोस्त अब आलसी हैं और पुनरावृत्तियों को लौटाते हैं। mapआमतौर पर साइड-इफेक्ट्स का उपयोग करना खराब अभ्यास माना जाता है; एक मानक for ... inलूप बेहतर होगा। देखें दृश्य और Iterators इसके बजाय की सूची में अधिक जानकारी के लिए।
ग्रेग क्राइमर

5
स्वाद और अभ्यास शैली के बावजूद, सूची समझ अभी भी Py3 में काम करना चाहिए [myDict.pop(i, None) for i in ['a', 'c']], क्योंकि वे map(और filter) के लिए एक सामान्य विकल्प प्रदान करते हैं ।
माइकल एकोका

@MichaelEkoka आप उनके दुष्प्रभाव के लिए सूची समझ का उपयोग नहीं करना चाहिए, एक नियमित for ... inलूप का उपयोग करें ।
बोरिस

@ बोरिस तुम शायद सही हो। मेरा उत्तर विशेष रूप से उपयोग करने से संबंधित है map(), जिसका उपयोग अक्सर इसके दुष्प्रभावों के लिए किया जाता है। अजगर में सिफारिश विकल्प है सूची समझ है, जो मेरी राय में अभी भी काफी पठनीय और एक एक लाइनर (प्रश्न देखें) के रूप में ज्ञान के लिहाज से हल्का है। केवल उनके दुष्प्रभावों के लिए उपयोग किया जाता है, दोनों निर्माण वास्तव में एक बेकार सूची में परिणाम करते हैं, जो अक्षम हो सकता है। Python3 के रूप में, मुझे एक अंतर्निहित फ़ंक्शन के बारे में पता नहीं है जो एक जनरेटर अभिव्यक्ति के माध्यम से सुरक्षित रूप से और सुरुचिपूर्ण ढंग से पुनरावृति कर सकता है, बिना महंगा बायप्रोडक्ट के loop(d.pop(k) for k in ['a', 'b'])
माइकल एकोका

मुझे खुशी है कि मेरे हर समय के सबसे उत्कीर्ण जवाब में कुछ ऐसे हैक शामिल हैं जिनका मैं कभी उपयोग नहीं करूंगा। मेरी राय में सूची समझ (विकल्प 3) सबसे कम बुरा दृष्टिकोण है। उस एक का उपयोग करो।
मार्क मैक्समिस्टर

19

आप उस कुंजी को हटाकर एक नया शब्दकोश बनाने के लिए एक शब्दकोश समझ का उपयोग कर सकते हैं :

>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}

आप शर्तों से हटा सकते हैं। कोई त्रुटि नहीं अगर keyमौजूद नहीं है।



7

हम कुछ निम्नलिखित तरीकों से पायथन शब्दकोश से एक कुंजी को हटा सकते हैं।

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

कांटा इस भविष्य में संदर्भ के लिए सार, तो आप इस उपयोगी पाते हैं।


1
if myDict.get('one')यदि कोई कुंजी मौजूद है, तो जांचने के लिए उपयोग न करें ! यह विफल रहता है अगर myDict ['एक'] का एक गलत मूल्य है। इसके अलावा, dicts में एक अंतर्निहित आदेश नहीं है, इसलिए इसका उल्लेख करने का कोई मतलब नहीं है।
राब

@Rob dicts को CPython 3.6 के साथ शुरू होने वाले सम्मिलन आदेश और 3.7 से शुरू होने वाले अन्य सभी Python कार्यान्वयनों द्वारा आदेशित किया गया है।
बोरिस

4

यदि आप बहुत क्रियात्मक होना चाहते हैं तो आप अपवाद से निपटने का उपयोग कर सकते हैं:

try: 
    del dict[key]

except KeyError: pass

हालांकि, यह pop()विधि की तुलना में धीमी है, अगर कुंजी मौजूद नहीं है।

my_dict.pop('key', None)

यह कुछ चाबियों के लिए मायने नहीं रखेगा, लेकिन यदि आप इसे बार-बार कर रहे हैं, तो बाद का तरीका एक बेहतर शर्त है।

सबसे तेज़ तरीका यह है:

if 'key' in dict: 
    del myDict['key']

लेकिन यह विधि खतरनाक है क्योंकि अगर 'key'दो लाइनों के बीच में हटा दिया जाता है, तो एक KeyErrorउठाया जाएगा।


1

मैं अपरिवर्तनीय संस्करण पसंद करता हूं

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}

1

एक अन्य तरीका आइटम () + ताना बोध का उपयोग करके है

आइटम () तानाशाह की समझ के साथ मिलकर हमें कुंजी-मूल्य जोड़ी विलोपन के कार्य को प्राप्त करने में भी मदद कर सकते हैं, लेकिन, यह एक अयोग्य तानाशाही तकनीक नहीं होने का दोष है। वास्तव में अगर हम शामिल करने की इच्छा नहीं रखते हैं, तो एक नया ताना-बाना बनता है।

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}

0

कुंजी पर एकल फ़िल्टर

  • "कुंजी" लौटाएं और इसे my_dict से हटा दें यदि my_dict में "कुंजी" मौजूद है
  • कोई भी नहीं अगर "कुंजी" my_dict में मौजूद नहीं है

यह 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()
            )
    )
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.