简体   繁体   中英

Python : Convert list of tuple to dict

I am receiving a response from imap server like below. Which contains all the folders for particular user account.

imap.list_folders() outputs :

[((b'\\HasChildren',), b'.', 'welcome'), ((b'\\HasChildren',), b'.', 'welcome.welcomeqqqqq'), ((b'\\HasNoChildren',), b'.', 'welcome.welcomeqqqqq.downunder'), ((b'\\HasNoChildren',), b'.', 'test2'), ((b'\\HasNoChildren',), b'.', 'Arunnnnnnnnn')]

Here welcome is the folder name. And HasChildren means the folder has a child. welcome.welcomeqqqqq is the children of welcome . Parent and Child are separated by dot. I want to form a treeview format from the folder list recursively.

Expected output :

[
    {
        "folder": "Top",
        "parent": "None",
        "children": [
            {
                "folder": "Folder 1",
                "parent": "Top",
                "children": [
                    {
                        "folder": "Sub Folder 1",
                        "parent": "Folder 1",
                        "children": []
                    },
                    {
                        "folder": "Sub Folder 2",
                        "parent": "Folder 1",
                        "children": [
                            {
                                "folder": "Sub Folder Sub Folder 1",
                                "parent": "Sub Folder 2",
                                "children": []
                            },
                            {
                                "folder": "Sub Folder Sub Folder 2",
                                "parent": "Sub Folder 2",
                                "children": []
                            }
                        ]
                    }
                ]
            },
            {
                "folder": "Folder 2",
                "parent": "Top",
                "children": []
            }
        ]
    }
]

Any help would be appreciated.

You can do this with a recursive function:

folders = [
            ((b'\\HasChildren',), b'.', 'welcome'), 
            ((b'\\HasChildren',), b'.', 'welcome.welcomeqqqqq'), 
            ((b'\\HasNoChildren',), b'.', 'welcome.welcomeqqqqq.downunder'), 
            ((b'\\HasNoChildren',), b'.', 'test2'), 
            ((b'\\HasNoChildren',), b'.', 'Arunnnnnnnnn')
]

def make_my_list_of_dict(my_list_of_folders, check_parent = None):
    my_list = []
    for e in my_list_of_folders: 
        split_char = e[1].decode()
        parent = e[2].split(split_char)[-2] if split_char in e[2] else None
        folder = e[2].split(split_char)[-1]
        if parent == check_parent:
            if e[0][0] == b'\\HasChildren':
                children = make_my_list_of_dict(my_list_of_folders, folder)
                my_list.append({'folder':folder, 'parent':parent, 'children':children})
            else:
                my_list.append({'folder':folder, 'parent':parent, 'children':[]})
    return my_list

result = make_my_list_of_dict(folders)
print(result)

output:

[
    {'folder': 'welcome', 
     'parent': None, 
     'children': [
                     {'folder': 'welcomeqqqqq', 
                      'parent': 'welcome', 
                      'children': [
                                      {'folder': 'downunder', 
                                       'parent': 'welcomeqqqqq', 
                                       'children': []
                                      }
                                  ]
                     }
                 ]
    }, 

    {'folder': 'test2', 
     'parent': None, 
     'children': []
    }, 

    {'folder': 'Arunnnnnnnnn', 
     'parent': None, 
     'children': []
    }
]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM