我有一个字典列表,其中很少可以嵌套。
我想让它成为一个简单的字典列表。
这里,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/