Python: конвертировать список кортежей в dict - PullRequest
0 голосов
/ 08 мая 2018

Я получаю ответ от сервера imap, как показано ниже. Который содержит все папки для конкретной учетной записи пользователя.

imap.list_folders() выходы:

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

Здесь welcome - имя папки. И HasChildren означает, что у папки есть дочерний элемент. welcome.welcomeqqqqq это дети welcome. Родитель и ребенок разделены точкой. Я хочу рекурсивно сформировать древовидный формат из списка папок.

Ожидаемый результат:

[
    {
        "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": []
            }
        ]
    }
]

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете сделать это с помощью рекурсивной функции:

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)

выход:

[
    {'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': []
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...