Python 将嵌套字典列表转换为字典的平面列表

Python 将嵌套字典列表转换为字典的平面列表,python,list,dictionary,nested,Python,List,Dictionary,Nested,我有一个字典的列表,其中很少有嵌套的。 我想把它列成一个简单的字典清单 这里,Message是一个字典列表,其中包含一个键“Message\u content”。 我想弹出“消息内容”,以防它包含关键消息。 嵌套可以达到任何级别。我的意思是“Message\u content”可能再次包含“Message”,尽管此处显示的示例仅针对一个级别 输入 预期输出: Message = [ {'Message_content': {'Argument': [{'Arg_name': 'acl_n

我有一个字典的列表,其中很少有嵌套的。 我想把它列成一个简单的字典清单
这里,Message是一个字典列表,其中包含一个键“Message\u content”。
我想弹出“消息内容”,以防它包含关键消息。

嵌套可以达到任何级别。我的意思是“Message\u content”可能再次包含“Message”,尽管此处显示的示例仅针对一个级别

输入

预期输出:

Message = [
    {'Message_content': {'Argument': [{'Arg_name': 'acl_name'}, {'Arg_name': 'acl_type'}]}},
    {'Message_content': {'Argument': [{'Arg_name': 'cat_name'}, {'Arg_name': 'cat_enum'}]}},
    {'Message_content': {'Argument': [{'Arg_name': 'ac_name'}, {'Arg_name': 'ac_type'}]}}
    ]
尝试编写递归函数,但无法处理嵌套。

任何帮助都将不胜感激。

这里的递归非常简单。你可以这样处理:

输入=[
{'Message_content':{
'参数':[{'Arg_name':'acl_name'},{'Arg_name':'acl_type'}],
'Message':{'Message_content':{'Arg_name':[{'cat_name'},{'Arg_name':'cat_enum'}]}
}},
{'Message_content':{'Arg_name':[{'ac_name'},{'Arg_name':'ac_type'}]}
]
def手柄_元件(元件、输出):
尝试:
arg=elem[“消息内容”][“参数”]
output.append(arg)
除KeyError外:
通过
尝试:
msg=elem[“消息内容”][“消息”]
打印“嵌套”
句柄元素(消息,输出)
除KeyError外:
打印“不嵌套”
out=[]
对于输入中的元素:
句柄元素(元素,输出)
打印出来
或者,为了避免递归调用导致堆栈溢出,您可以将其转换为迭代过程,使用列表跟踪要处理的元素。将嵌套元素插入列表的方式将决定嵌套内容在输出列表中出现的顺序。这里,处理“队列”末尾的嵌套结构:

Message = [
    {'Message_content': {'Argument': [{'Arg_name': 'acl_name'}, {'Arg_name': 'acl_type'}]}},
    {'Message_content': {'Argument': [{'Arg_name': 'cat_name'}, {'Arg_name': 'cat_enum'}]}},
    {'Message_content': {'Argument': [{'Arg_name': 'ac_name'}, {'Arg_name': 'ac_type'}]}}
    ]
message = [
    {'Message_content': {
            'Argument': [{ 'Arg_name': 'acl_name' }, { 'Arg_name': 'acl_type' }],
            'Message': { 'Message_content': { 'Argument': [{ 'Arg_name': 'cat_name' }, { 'Arg_name': 'cat_enum' }] } }
    }},
    { 'Message_content': { 'Argument': [{ 'Arg_name': 'ac_name' }, { 'Arg_name': 'ac_type' }] } }
]

elements_to_handle = message
def handle_element(elem, output):
    try:
        arg = elem["Message_content"]["Argument"]
        output.append(arg)
    except KeyError:
        pass
    try:
        msg = elem["Message_content"]["Message"]
        elements_to_handle.append(msg)
    except KeyError:
        pass


out = []
while len(elements_to_handle):
    handle_element(elements_to_handle.pop(), out)

print out