2017-01-09 9 views
9

यदि मेरे पास कोई तत्व है तो मैं एक शब्दकोश से प्राप्त करने की कोशिश कर रहा हूं: my_dict[i]['level_1']['level_2']['my_var']क्या Python में एक शब्दकोश तत्व के लिए एक साफ परीक्षण है?

वहाँ ऐसा करने nulls के लिए जाँच करने के लिए की तुलना में एक क्लीनर तरीका है?

if 'level_1' in my_dict[i]: 
    if 'level_2' in my_dict[i]['level_1']: 
     if 'my_var' in my_dict[i]['level_1']['level_2']: 
      my_var = my_dict[i]['level_1']['level_2']['my_var'] 
+8

आप 'dict.get' -' my_dict [i] .get ('level_1', {}) का उपयोग कर सकते हैं। ('Level_2', { })। मिलता है ('my_var') '। यदि नहीं मिला तो यह 'कोई नहीं' होगा। – jonrsharpe

+7

या 'कोशिश-छोड़कर KeyError' ब्लॉक –

+4

यहां आपका दृष्टिकोण पूरी तरह से उस पर निर्भर करेगा जो आप पूरा करने की कोशिश कर रहे हैं और वांछित व्यवहार। एक सरल 'my_var = my_dict [i] [' level_1 '] [' level_2 '] [' my_var ']' 'कोशिश-छोड़कर' में लपेटा गया है, या जाने का तरीका हो सकता है, या जोनशर्प प्रस्तावित है, आपकी प्रकृति के आधार पर डेटा। –

उत्तर

7

आप बस परिभाषित कर सकते हैं अपनी खुद की:

def get_deep(dic,*keys,default=None): 
    for key in keys: 
     if isinstance(dic,dict) and key in dic: 
      dic = dic[key] 
     else: 
      return default 
    return dic 

या आप परीक्षण करना चाहते हैं:

def in_deep(dic,*keys): 
    for key in keys: 
     if isinstance(dic,dict) and key in dic: 
      dic = dic[key] 
     else: 
      return False 
    return True 

आप in_deep(my_dict[i],'level1','level2','my_var') के साथ इस कोड का उपयोग कर सकते हैं और यह True वापस आ जाएगी, तो यह कर सकते हैं वास्तव में शब्दकोश में गहरी हो जाओ। यदि आप उस तत्व को गहरा प्राप्त करना चाहते हैं, तो आप get_deep(my_dict[i],'level1','level2','my_var') पर कॉल कर सकते हैं। get_deepdefault पैरामीटर (डिफ़ॉल्ट रूप से None द्वारा) वापस कर देगा यदि यह पथ तक नहीं पहुंच सकता है।

3

यहाँ मेरी एक लाइनर है:

# returns False or the value of the end element 
reduce(lambda x, y: x and y in x and x[y], list_of_keys, target_dictionary) 

उदाहरण:

a = {'b': {'c': {'d': True}}} 
reduce(lambda x, y: x and y in x and x[y], ['b', 'c', 'd'], a) # True 
reduce(lambda x, y: x and y in x and x[y], ['b', 'cd', 'd'], a) # False 

यह कैसे काम करता: कम करने के हर यात्रा में, यह जाँच करता है कि previouis कुंजी लक्ष्य शब्दकोश में थे (x) । यदि नहीं, तो यह तुरंत and स्थिति की वजह से झूठी वापसी करेगा और सूची को प्रचारित करेगा। फिर, यह जांच करेगा कि अनुरोधित कुंजी dict (x in y) में है या नहीं। यदि ऐसा है, तो यह निचले स्तर के शब्दकोश को निम्न स्तर पर x के रूप में पारित करेगा।

नोट: पिछले तत्व (एक [ 'बी'] [ 'सी'] [ 'प']) यह सच है के लिए मूल्यांकन करने के लिए है। यदि आप अंत में झूठी उम्मीद करते हैं, तो अंतिम स्तर को स्पष्ट रूप से देखें: 'd' in reduce(...)

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