पथ

2013-04-30 4 views
9

के रूप में कुंजी स्ट्रिंग की एक सूची का उपयोग कर एक dict को जोड़ना मैं निम्नलिखित dict है:पथ

aDict = { 
    "a" : { 
     "b" : { 
      "c1" : {}, 
      "c2" : {}, 
     } 
    } 
} 

एक दूसरे dict:

aSecondDict = { 
    "d1" : {}, 
    "d2" : {}, 
    "d3" : {}, 
} 

और एक "पथ" टपल:

path = ("a", "b", "c2") 

अब मैं टुपल द्वारा प्रदान किए गए पथ पर पहले दूसरे टूल को जोड़ना चाहता हूं:

aResultDict = { 
    "a" : { 
     "b" : { 
      "c1" : {}, 
      "c2" : { 
       "d1" : {}, 
       "d2" : {}, 
       "d3" : {}, 
      }, 
     } 
    } 
} 

इसे प्राप्त करने का पाइथोनिक तरीका क्या है?

+1

में निकाल दिया जाता है आप कृपया अपने शब्दकोशों – jamylak

+0

धन्यवाद मार्टिन्यू :) –

उत्तर

11

आप reduce का उपयोग कर सकते शब्दकोश पाने के लिए और dict.update वहाँ में नई सामग्री डाल करने के लिए:

reduce(lambda d,key: d[key],path,aDict).update(aSecondDict) 

आप कर सकते हैं भी हो थोड़ा और चालाक अगर आप चाहते हैं:

reduce(dict.__getitem__,path,aDict).update(aSecondDict) 

मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि दो दृष्टिकोण थोड़ा अलग हैं। उत्तरार्द्ध aDict में केवल अधिक शब्दकोश (या dict सबक्लास) शामिल हैं, जबकि पूर्व विधि aDict में होने वाली किसी भी चीज़ की अनुमति देता है। As noted in the comments, आप भी इस्तेमाल कर सकते हैं:

reduce(dict.get,path,aDict).update(aSecondDict) 

हालांकि, इस संस्करण एक AttributeError यदि आप तो मैं यह पसंद नहीं है एक "लिंक" राह में जो बल्कि एक KeyError से न के बराबर है पार करने के लिए कोशिश बढ़ा देंगे काफी ज्यादा यह विधि यह भी लागू करती है कि पथ के साथ प्रत्येक मान dict या dict सबक्लास है।

reduce python2.x के लिए एक अंतर्निहित है। Python2.6 से शुरू करना यह functools.reduce के रूप में भी उपलब्ध है। कोड जो python3.x के साथ संगत होना चाहता है, functools.reduce उपयोग करने के लिए के रूप में निर्मित python3.x

+0

को ठीक करने या '(dict.get, पथ को कम कर सके कोशिश करनी चाहिए डी) ' – jamylak

+0

@jamylak - दाएं। प्रारंभकर्ता हमेशा आखिरी चला जाता है। धन्यवाद। – mgilson

+1

यदि ओपी एक प्रतिलिपि चाहता है तो वह सिर्फ 'copy.deepcopy' का उपयोग कर सकता है और फिर यह – jamylak

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