2016-03-03 167 views
2

我有一個可能嵌套的字典列表。 我想使它成爲詞典的平面列表。
這裏,消息是具有密鑰'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'}]}} 
    ] 

試着寫一個遞歸函數,但無法處理嵌套。
任何幫助,將不勝感激。

回答

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