如何在Python中使用嵌套dicts创建一个新的dicts dict

时间:2016-08-31 21:35:19

标签: python python-2.7 dictionary

我从一个从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周)很新,所以如果这很简单,请不要苛刻。

1 个答案:

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