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

时间:2016-03-03 12:03:12

标签: python list dictionary nested

我有一个字典列表,其中很少可能嵌套。 我想把它变成一个单词列表。
这里,Message是一个字典列表,其中包含一个键' Message_content'。
我想弹出' Message_content'如果它包含密钥消息。

嵌套可以达到任何水平。我的意思是' Message_content'可能会再次包含'消息'虽然这里显示的例子是一个级别

输入

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

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

1 个答案:

答案 0 :(得分:2)

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

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