我正在使用一种API,该API以一种奇怪的“树状”数据结构格式返回数据,我试图将其转换为适当的JSON对象以实现可重用性。
它有点像“树”结构,我很幸运只转换了“键”,但是在将值与之关联时遇到了麻烦。以下答案https://stackoverflow.com/a/9619101/1899406似乎是一个很好的起点。
代码:
dct = {}
for key in config.keys():
p = dct
for x in key.split('/'):
p = p.setdefault(x, {})
开始数据:
{ u'key':
u'/parent/child/child2/keyname1',
u'value': u'arbitrary value'},
{ u'key': u'/parent/child/keyname2',
u'value': u'arbitrary value2'},
{ u'key':
u'/parent/child/child2/child3/child4/child5/keyname3',
u'value': u'arbitrary value3'},
{ u'key': u'/parent/keyname4',
u'value': u'arbitrary value4'},
...
轻微清理:
{{ u'/parent/child/child2/keyname1':
u'arbitrary value'},
{ u'/parent/child/keyname2':
u'arbitrary value2'},
{ u'/parent/child/child2/child3/child4/child5/keyname3':
u'arbitrary value3'},
{ u'/parent/keyname4':
u'arbitrary value4'}}
所需格式(大致):
{
u'parent': {
u'keyname4': u'arbitrary value4',
u'child': {
u'keyname2': u'arbitrary value2',
u'child2': {
u'keyname1': u'arbitrary value',
u'child3': {
u'child4': {
u'child5': {
u'keyname4': u'arbitrary value4'
}
}
}
}
}
}
}
答案 0 :(得分:1)
似乎您需要拆分/
上的键值,然后使用每个键值构建一个对象。 dict.setdefault()
在这里非常方便,因为它使您可以在键处获取一个值或将其设置为默认值,并在尚未定义键的情况下获取该值。
这会在setdefault()
中使用reduce
(您也可以使用for
循环并只跟踪当前字典)来向下遍历到倒数第二个键。然后使用最后一个键设置值:
from functools import reduce
d = {}
for item in tree:
for k, v in item.items():
path = k.split('/')
parent = reduce(lambda curr, x: curr.setdefault(x, {}), path[1:-1], d)
parent[path[-1]] = v
d
的结尾应如下所示:
{'parent': {
'child': {
'child2': {'keyname1': 'arbitrary value',
'child3': {
'child4': {
'child5': {'keyname3': 'arbitrary value3'}
}
}
},
'keyname2': 'arbitrary value2'},
'keyname4': 'arbitrary value4'}
} # i *think* I got the indents right!