嵌套字典串联键

嵌套字典串联键

问题描述:

给定一个嵌套的字典:嵌套字典串联键

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://*.com/questions/6027558/flatten-nested-python-dictionaries-compressingkeys或http://*.com/a/3835252/3336968开始 – fredtantini 2014-10-01 15:26:59

递归解决方案是最简单的。此代码按照您的要求提供。

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://*.com/a/9526480/4099278)所述。 – kwargs 2014-10-02 10:10:49