Search code examples
pythondictionarytreeviewimap

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.


Solution

  • 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': []
        }
    ]