【问题标题】:How do I create a new dict of dicts from a dict with nested dicts in Python如何在 Python 中从带有嵌套字典的字典创建一个新的字典字典
【发布时间】:2016-08-31 21:35:19
【问题描述】:

我从一个从 api 收到的 dict 开始

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

我需要从该字典创建一个单独的字典。每个键和值都由它们的键和值分隔到自己的字典中。同时保持嵌套的字典完整。

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

实际的字典要大一些,但原来的嵌套字典不超过两个,但嵌套的字典很多。这是 api 接受新数据的唯一方式,所以我有点卡住了,直到我弄明白为止。非常感谢任何帮助,因为我对 Python 很陌生(3 周)哈哈,所以如果这很简单,请不要太苛刻。

【问题讨论】:

  • 你有没有尝试自己写一些东西?在问题中添加一些代码...
  • 您的c 值有点神秘。您有一个列表,该列表中有一个字典,但结果输出是一个列表,其中包含从该字典转换为单独字典的键值对。如果c 列表中有多个元素会发生什么?如果包含更多列表或不是字典的对象怎么办?这同样适用于d2
  • 我下面的解决方案会产生一个 nested 列表,因为单个字典被转换为键值字典列表。如果有多个字典,这意味着每个字典都将成为主 c 列表中的一个单独列表。任何其他对象类型也可以通过这种方式正确处理。

标签: python python-2.7 dictionary


【解决方案1】:

您可以使用递归函数构建输出:

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

【讨论】:

  • 因此,在使用嵌套字典时,您需要一个递归函数,以便当遇到嵌套字典时,它可以循环回函数并继续。在字典旁边处理字典?非常感谢您的帮助,非常感谢!!!!
  • 请注意,您没有使用递归;我只是发现为此编写递归函数更容易。你也可以使用堆栈和循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多