我从一个从api收到的词典开始
start_dict = {
"a": 795,
"b": 1337,
"c": [
{
"d1": 2,
"d2": [
{
"e1": 4
}
]
}
]
}
我需要从该词典中创建一个单独的词典。这使得每个键和值由它们的键和值分隔成自己的dict。同时保持嵌套的dicts完整。
values =
{
"fields": [
{
"element_name": "a",
"value": 795
},
{
"element_name": "b",
"value": 1337
},
{
"element_name": "c",
"value": [
{
"element_name": "d1",
"value": 2
},
{
"element_name": "d2",
"value" : [
{
"element_name": "e1",
"value": 4
}
]
]
}
]
}
实际的dict相当大,但原版中只有两个深嵌套的dicts,但许多单个嵌套的dicts。这是api接受新数据的唯一方法,所以在我搞清楚之前我有点困难。任何帮助都非常感谢,因为我对Python(3周)很新,所以如果这很简单,请不要苛刻。
答案 0 :(得分:5)
您可以使用递归函数构建输出:
def transform(ob):
if isinstance(ob, list):
return [transform(v) for v in ob]
elif not isinstance(ob, dict):
return ob
return [{'element_name': k, 'value': transform(v)}
for k, v in ob.items()]
values = {'fields': transform(start_dict)}
因此每个key, value
对转换为列表中的{'element_name': key, 'value': value}
字典,其中任何本身为列表或字典的值都通过递归调用进行转换。
演示:
>>> from pprint import pprint
>>> def transform(ob):
... if isinstance(ob, list):
... return [transform(v) for v in ob]
... elif not isinstance(ob, dict):
... return ob
... return [{'element_name': k, 'value': transform(v)}
... for k, v in ob.items()]
...
>>> start_dict = {
... "a": 795,
... "b": 1337,
... "c": [
... {
... "d1": 2,
... "d2": [
... {
... "e1": 4
... }
... ]
... }
... ]
... }
>>> pprint({'fields': transform(start_dict)})
{'fields': [{'element_name': 'a', 'value': 795},
{'element_name': 'c',
'value': [[{'element_name': 'd1', 'value': 2},
{'element_name': 'd2',
'value': [[{'element_name': 'e1', 'value': 4}]]}]]},
{'element_name': 'b', 'value': 1337}]}