2012-01-28 10 views
10

जब एक अजगर शब्दकोश के साथ काम कर मैं आमतौर पर निम्नलिखित मुहावरा का उपयोग करें:शब्दकोश (पायथन) को अपडेट किए बिना डिफ़ॉल्ट डिफॉल्ट में कुंजी की जांच कैसे करें?

try: 
    val = dct[key] 
except KeyError: 
    print key, " is not valid" 

बड़े शब्दकोशों के लिए के बाद से, बयान

if key in dct: 
    # do something 

बहुत ही कुशल नहीं है (ताकि मैं पढ़ याद है, लेकिन मैं है इसे अभ्यास में भी देखा)

आज मैं एक डिफॉल्ट डिक्ट के साथ काम कर रहा था और एक पल के लिए मैं भूल गया था कि एक डिफॉल्ट डिक्ट आपको कभी भी एक एरर नहीं देगा बल्कि इसके बजाय मूल शब्दकोश अपडेट करेगा।

डिफ़ॉल्ट डिफॉल्ट अपडेट किए बिना मैं लुकअप कैसे कर सकता हूं? मुझे वास्तव में एक त्रुटि मुद्रित करने की आवश्यकता है ताकि उपयोगकर्ता कुंजी को पुन: प्रस्तुत कर सके।

धन्यवाद!

अद्यतन: कई पोस्टर्स ने सुझाव दिया कि मेरा विश्वास है कि if key in dct: धीमा है। मैं वापस गया और उस पुस्तक की जांच की जिसमें मैंने पढ़ा था try: except: का उपयोग करना बेहतर है। यह 2002 की पायथन कुकबुक है, एलेक्स मार्टेलि द्वारा रेसिपी 1.4, जिसे यहां ऑनलाइन भी पाया जा सकता है: Add an entry to dictionary। पुरानी यादें इतनी अविश्वसनीय हैं! नुस्खा में "धीमे" का उल्लेख नहीं है और यह in का उपयोग भी नहीं कर रहा है लेकिन has_key है। यह बस कहता है कि try: except: अधिक पाइथोनिक (कम से कम नुस्खा का पुस्तक संस्करण) है। सुधार और उत्तरों के लिए धन्यवाद।

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/1602934/what-is-a-good-way-to-test-if-a-key-exists-in-python-dictionary –

+1

कोई डुप्ली नहीं; यह 'डिफॉल्टडिक्ट' के बारे में है। –

+7

'डी में कुंजी धीमी, अवधि नहीं है। यदि आप अन्यथा कहते हैं, तो आपके पास ठोस प्रमाण है। 'टाइमिट 'का कहना है कि यह एक सफल' डी [कुंजी] 'जितना तेज़ है, और' डी [कुंजी] '+' से अधिक (लगभग 10x) तेज है: पास '(दिया गया है, यह एक स्पष्ट' अगर' कुंजी लगभग हमेशा मौजूद है)। अब, 'dkeys()' (पायथन 2.x) में कुंजी या सूची में कुंजी (डी।कुंजी()) '(पायथन 3.x) धीमा है, लेकिन ऐसा इसलिए है क्योंकि यह जानबूझकर हैश टेबल जानकारी को फेंक रहा है। – delnan

उत्तर

17

डिफ़ॉल्ट डिफॉल्ट अपडेट किए बिना मैं लुकअप कैसे कर सकता हूं?

key in dct के साथ, यानी स्पष्ट रूप से।

यदि यह वास्तव में आपके लिए बहुत महंगा है (माप और आप सुनिश्चित होंगे), विशिष्ट परिस्थितियों के लिए कामकाज हैं। उदाहरण के लिए, यदि आपका डिफ़ॉल्ट मान 'ham' है और कुछ स्थितियों में आप defaultdict में (key, 'ham') स्टोर करने के लिए जब key नहीं मिला है नहीं करना चाहते, आप कर सकते हैं

dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything 
+7

'has_key' को 'dct' में' के पक्ष में बहिष्कृत किया गया है - कृपया पुराने मुहावरे के उपयोग को बढ़ावा न दें। – PaulMcG

8

key in dct, तेजी से होने की है कह रही है कि है धीमा यह कहने जैसा होगा कि dct[key] धीमा है, और यह कभी भी मामला नहीं होना चाहिए। एक कुंजीपटल से एक तत्व को पुनर्प्राप्त करने के लिए कुंजी की एक कुंजी और परीक्षण सदस्यता को किसी भी सभ्य शब्दकोश कार्यान्वयन में ओ (1) संचालन होना चाहिए, और यह देखना आसान है कि एक्सेस ऑपरेशन के संदर्भ में सदस्यता ऑपरेशन कैसे कार्यान्वित किया जा सकता है।

defaultdict के साथ अपने प्रश्न के लिए, बस in का उपयोग करें। और सामान्य शब्दकोश में in के उपयोग से बचने का कोई कारण नहीं है।

संबंधित मुद्दे