如何从Python中具有嵌套dict的dict创建dict的新dict

2024-04-25 01:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个api接收的dict开始

start_dict = { 
    "a": 795, 
    "b": 1337, 
    "c": [
        {
            "d1": 2,
            "d2": [
                 {
                      "e1": 4
                 }
        ]
        }
    ]
    }

我需要从该dict.中创建一个单独的dict,其中每个键和值都由它们的键和值分隔到自己的dict.中,同时保持嵌套的dict完好无损。你知道吗

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要大一些,但是在原始的dict中没有超过一个两个深嵌套的dict,而是有许多单嵌套的dict。这是api接受新数据的唯一方法,所以在我弄清楚之前我有点困了。任何帮助是非常感谢,因为我是相当新的Python(3周)笑,所以如果这是一些简单的东西,请不要苛刻。你知道吗


Tags: 数据方法nameapifieldsvalueelementstart
1条回答
网友
1楼 · 发布于 2024-04-25 01:58:17

可以使用递归函数生成输出:

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}]}

相关问题 更多 >