2014-10-01 103 views
-3

給定一個嵌套的字典:嵌套字典串聯鍵

nested = { 
    'A': { 
     'B': { 
      'C': 'C val', 
      'G': 'G val' 
     }, 
     'D': { 
      'E': { 
       'F': 'F val' 
      } 
     } 
    } 
} 

我想遞歸地串聯詞典的按鍵,除了「最終」鍵值對,並把級聯鍵在新字典,像這樣:

expected = { 'A:B': {'C': 'C val', 'G': 'G val'}, 'A:D:E': {'F': 'F val'} }

我怎麼能做出這樣的功能,不知道事先嵌套字典的結構?

+1

你將不得不編寫一個函數。檢查http://stackoverflow.com/questions/6027558/flatten-nested-python-dictionaries-compressingkeys或http://stackoverflow.com/a/3835252/3336968開始 – fredtantini 2014-10-01 15:26:59

回答

1

遞歸解決方案是最簡單的。此代碼按照您的要求提供。

def flatten(dictionary, prefix=[], result={}): 

    for k, v in dictionary.iteritems(): 
     type_v = type(v) 
     if type_v == dict: 
      flatten(v, prefix+[k], result) 
     elif type_v == str: 
      prefix_str = ':'.join(prefix) 
      if not prefix_str in result: 
       result[prefix_str] = {} 
      result[prefix_str][k] = v 
     else: 
      raise TypeError('%s not permissible in data structure' % type_v) 

    return result 


nested = { 
    'A': { 
     'B': { 
      'C': 'C val', 
      'G': 'G val', 
     }, 
     'D': { 
      'E': { 
       'F': 'F val', 
      } 
     } 
    } 
} 

expected = flatten(nested) 
print(expected) 

輸出

{'A:B': {'C': 'C val', 'G': 'G val'}, 'A:D:E': {'F': 'F val'}} 
+0

謝謝!我過度思考這個問題,但是你通過傳遞'prefix'作爲函數參數來解決它。我也改變了前綴和結果的默認值,如[這裏](http://stackoverflow.com/a/9526480/4099278)所述。 – kwargs 2014-10-02 10:10:49