Самый эффективный способ построить глубоко вложенный словарь из списка словарей в Python - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть список словарей l, каждый из них представляет собой простой одноуровневый словарь с одинаковыми клавишами a, b, c, d.
Теперь я хочу построить вложенный словарь из l в этой форме (i является членом l):

{
    i['a']: {
        i['b']: {
            i['c']: {
                i['d']: some_value,
            }
        }
    }
}

Сейчас я использую этот фрагмент:

tmp = {}
for i in l:
    if not i['a'] in tmp:
        tmp[i['a']] = {}
    if not i['b'] in tmp[i['a']]:
        tmp[i['a']][i['b']] = {}
    if not i['c'] in tmp[i['a']][i['b']]:
        tmp[i['a']][i['b']][i['c']] = {}
    tmp[i['a']][i['b']][i['c']][i['d']] = some_value

Это самый эффективный способ, если первоначальный список огромен?

1 Ответ

0 голосов
/ 13 ноября 2018

Я бы вложил несколько collection.defaultdict объектов, чтобы избежать тестирования ключей и использовать собственный код вместо медленного кода Python. Если ключ не существует, создается словарь по умолчанию, за исключением более глубокого, который может быть просто dict:

tmp = collections.defaultdict(lambda : collections.defaultdict(lambda : collections.defaultdict(dict)))
for i in l:
    tmp[i['a']][i['b']][i['c']][i['d']] = some_value

Вы можете сократить определение, наложив псевдоним на имя объекта:

dd = collections.defaultdict
tmp = dd(lambda : dd(lambda : dd(dict)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...