2011-10-25 16 views
30

मैं एक शब्दकोश चाहता हूं जिसमें राज्य संक्रमण का एक सेट हो। मुझे लगता है कि मैं इसे राज्यों = डिफ़ॉल्ट डिक्ट (कोई नहीं) का उपयोग करके कर सकता हूं, लेकिन यह मेरी अपेक्षा के अनुसार काम नहीं कर रहा है। उदाहरण के लिए:डिफ़ॉल्ट डिक्ट (कोई नहीं)

states = defaultdict(None) 
if new_state_1 != states["State 1"]: 
    dispatch_transition() 

मैं सोचा होगा कि राज्यों [ "राज्य 1"] मूल्य कोई भी वापसी होगी और है कि अगर NEW_STATE एक bool कि मैं NEW_STATE के लिए झूठी प्राप्त होंगे है = राज्यों [ "राज्य 1! "], लेकिन इसके बजाय मुझे एक KeyError मिलता है।

मैं क्या गलत कर रहा हूं?

धन्यवाद,

बैरी

उत्तर

53

defaultdict तर्क यह है कि डिफ़ॉल्ट-मूल्य जब बहस किए बिना आमंत्रित प्रदान करता है के रूप में एक प्रतिदेय की आवश्यकता है। None कॉल करने योग्य नहीं है।

defaultdict(lambda: None) 
+7

काफी नहीं; 'Noned' वास्तव में' defaultdict() 'के लिए डिफ़ॉल्ट तर्क है। लेकिन आपका समाधान अभी भी अच्छा है :) –

+0

@Tim: आप सही हैं, लेकिन समाधान वही रहता है। –

+0

[भ्रमित] यहां "बिल्कुल नहीं" क्या है? क्या मैंने पहले के संपादन को याद किया था जिसे सिस्टम द्वारा नहीं रखा गया था? मुझे बोजर्न के स्पष्टीकरण या उत्तर के साथ कुछ भी गलत नहीं दिख रहा है। –

0

मुझे लगता है कि मैं भी ऐसा कर सकता है: क्या आप चाहते हैं यह है

states = {} 
... 
if not new_state_1 in states or new_state_1 != states["State 1"]: 
    dispatch_transition() 

लेकिन मैं बहुत defaultdict विधि पसंद करते हैं।

9

इस प्रयोग के मामले में, defaultdict बिल्कुल का उपयोग नहीं करते - एक सादे dict ठीक करना होगा:

states = {} 
if new_state_1 != states.get("State 1"): 
    dispatch_transition() 

dict.get() विधि किसी कुंजी के लिए मूल्य, या एक डिफ़ॉल्ट मान है, तो रिटर्न कुंजी नहीं मिली है। डिफ़ॉल्ट मान None पर डिफ़ॉल्ट है।

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