嵌套字典串联键
问题描述:
给定一个嵌套的字典:嵌套字典串联键
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'} }
我怎么能做出这样的功能,不知道事先嵌套字典的结构?
答
递归解决方案是最简单的。此代码按照您的要求提供。
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
你将不得不编写一个函数。检查http://*.com/questions/6027558/flatten-nested-python-dictionaries-compressingkeys或http://*.com/a/3835252/3336968开始 – fredtantini 2014-10-01 15:26:59