python - 将嵌套字典列表转换为平面字典列表

标签 python list dictionary nested

我有一个字典列表,其中很少可以嵌套。 我想让它成为一个简单的字典列表。
这里,Message 是一个具有键“Message_content”的字典列表。
我想弹出“Message_content”,以防它包含关键消息。

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

输入

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

预期输出:

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

尝试编写递归函数,但无法处理嵌套。
任何帮助将不胜感激。

最佳答案

这里的递归非常简单。你可以像这样解决它:

input = [
    {'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' }] } }
]

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


out = []
for elem in input:
    handle_element(elem, out)

print out

或者,为了避免由于递归调用而导致堆栈溢出,您可以将其转换为迭代过程,使用列表来跟踪要处理的元素。将嵌套元素插入列表的方式将决定嵌套元素在输出列表中出现的顺序。在这里,您处理“队列”末尾的嵌套结构:

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

关于python - 将嵌套字典列表转换为平面字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35771716/

相关文章:

arrays - 在一组树中找到正方形

list - 在 Kotlin 中,如何在迭代时修改列表的内容

python - 如何获取从 QListView 中选择的项目?

java检查对象列表是否包含具有具体名称的对象

python - python中字典的递归遍历(图遍历)

swift - 在 Swift 中按键分组字典

python - Python dicts 如何保持按键顺序

javascript - 显示用户相对时区的 UTC 时间戳的时间

python - 迭代 DataFrame 的列并分配值

python - 添加类对象的实例变量