2010-08-09 14 views
5
>>> d2 
{'egg': 3, 'ham': {'grill': 4, 'fry': 6, 'bake': 5}, 'spam': 2} 
>>> d2.get('spamx',99) 
99 
>>> d2.get('ham')['fry'] 
6 

मैं हैम के अंदर तलना का मूल्य प्राप्त करना चाहता हूं, यदि नहीं, तो दूसरा उदाहरण के रूप में मूल्य, 99 या 88 प्राप्त करें। पर कैसे?डिफ़ॉल्ट मूल्यों के साथ पायथन नेस्टेड डिक्शनरी लुकअप

उत्तर

13
d2.get('ham', {}).get('fry', 88) 

मैं इसे वास्तविक जीवन में कई बयानों में तोड़ दूंगा।

ham = d2.get('ham', {}) 
fry = ham.get('fry', 88) 
+3

बल्कि 'd2.get ('हैम', {})। ('Fry', 99) ', नहीं? (DRY!) – mykhal

+1

कुछ पठनीय बनाना! = खुद को दोहराएं। अपने आप को दोहराने के लिए हैम के तलना पाने के लिए एक फ़ंक्शन लिखना होगा, और उसके बाद स्पैम की तलना प्राप्त करने के लिए एक और फ़ंक्शन, जब दोनों फ़ंक्शंस को एक फ़ंक्शन के रूप में लिखा जा सकता है जो पैरामीटर के रूप में हैम/स्पैम लेता है। –

+0

@ जेसे, पिछले संस्करण में 'फ्राई' के दो संदर्भ थे और जादू संख्या के दो संदर्भ लौटाए गए थे। सुझाव एक अलग सुधार था। – Oddthinking

3

काम करने के लिए मिलता है के मूलभूत मूल्यों के लिए सही ढंग से पहले डिफ़ॉल्ट ताकि आप श्रृंखला कर सकते हैं .Get सही ढंग से कहता है पहले विफल रहता है, एक शब्दकोश की जरूरत है।

d.get('ham',{}).get('fry',88) 

आप भी एक कोशिश इस्तेमाल कर सकते हैं, ब्लॉक

def get_ham_fry() 
    try: 
    return d['ham']['fry'] 
    except AttributeError,e: 
    return 88 
+0

स्ट्रिंग इंडेक्सिंग या तो एक उठाएगी यदि कोई कुंजी नहीं मिलती है, तो 'KeyError', या' TypeError' अगर आइटम स्ट्रिंग इंडेक्सिंग का समर्थन नहीं करता है। मुझे लगता है कि 'AttributeError' केवल' get 'कॉल के लिए उपयुक्त है। –

3

छोड़कर आप इस एक बहुत क्या करने की जरूरत है, तो आप एक सहायक समारोह

def get_nested(d, list_of_keys, default): 
    for k in list_of_keys: 
     if k not in d: 
      return default 
     d=d[k] 
    return d 

print get_nested(d2,['ham','spam'],99) 
print get_nested(d2,['ham','grill'],99) 
+0

कम करने जैसा लगता है।' Functools.reduce (lambda डी, एक्स: डी [एक्स] यदि एक्स डिफ़ॉल्ट रूप से एक्स, ['हैम', 'स्पैम'], डी 2) ' – kennytm

+1

@ केनीटीएम, यह '[' बेकन ',' स्पैम 'के लिए' टाइप एरर 'उठाता है' –

0

यहाँ लिख सकते हैं निपटने के लिए एक समाधान है नेस्टेड शब्दकोशों के साथ:

def get(root, *keys): 
    """ 
    Returns root[k_1][k_2]...[k_n] if all k_1, ..., k_n are valid keys/indices. 
    Returns None otherwise 
    """ 
    if not keys: 
     return root 
    if keys[0] not in root: 
     return None 
    if keys[0] in root: 
     return get(root[keys[0]], *keys[1:]) 

उपयोग:

>>> d = {'a': 1, 'b': {'c': 3}} 
>>> get(d, 'b', 'c') 
3 
>>> get(d. 'key that's not in d') 
None 
>>> get(d) 
{'a': 1, 'b': {'c': 3}}