我有一个字典列表,其中很少可能嵌套。
我想把它变成一个单词列表。
这里,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'}]}}
]
尝试编写递归函数但无法处理嵌套 任何帮助将不胜感激。
答案 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