создать вложенный словарь одним вкладышем - PullRequest
0 голосов
/ 10 мая 2018

Привет, у меня есть три списка, и я хочу создать трехуровневый вложенный словарь, используя одну строку.

т.е.,

l1 = ['a','b']
l2 = ['1', '2', '3']
l3 = ['d','e']

Я бы хотел создать следующий вложенный словарь:

nd = {'a':{'1':{'d':0},{'e':0},'2':{'d':0},{'e':0},'3':{'d':0},{'e':0},'b':'a':{'1':{'d':0},{'e':0},'2':{'d':0},{'e':0},'3':{'d':0},{'e':0}}

Я попытался использовать zip для создания внешнего цикла и добавления списков, но элементы заменяются. Т.е. это не работает:

nd = {i:{j:{k:[]}} for i in zip(l1,l2,l3)}

Ответы [ 2 ]

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

Вы также можете использовать рекурсию с более простым циклом:

l1 = ['a','b']
l2 = ['1', '2', '3']
l3 = ['d','e']
def combinations(d):
  return {i:combinations(d[1:]) if d[1:] else 0 for i in d[0]}

print(combinations([l1, l2, l3]))

Выход:

{'b': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}, 'a': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}}

Редактировать: true one-liner:

print((lambda d:{i:combination(d[1:]) if d[1:] else 0 for i in d[0]})([l1, l2, l3]))

Output:

{'b': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}, 'a': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}}
0 голосов
/ 10 мая 2018

zip здесь не подойдет. zip последовательно перебирает все 3 списка. То, что вам нужно, это продукты - фактически 3 вложенных цикла. Вы можете объединить это в одно словарное понимание ценой некоторой читабельности.

>>> {i : {j : {k : 0 for k in l3} for j in l2} for i in l1}

{'a': {'1': {'d': 0, 'e': 0}, 
       '2': {'d': 0, 'e': 0}, 
       '3': {'d': 0, 'e': 0}},
 'b': {'1': {'d': 0, 'e': 0}, 
       '2': {'d': 0, 'e': 0}, 
       '3': {'d': 0, 'e': 0}}
}

Или, если вам нужен список одноключевых словарей на самом нижнем уровне (как предполагает ваш o / p),

>>> {i : {j : [{k : 0} for k in l3] for j in l2} for i in l1}

{'a': {'1': [{'d': 0}, {'e': 0}],
       '2': [{'d': 0}, {'e': 0}],
       '3': [{'d': 0}, {'e': 0}]},
 'b': {'1': [{'d': 0}, {'e': 0}],
       '2': [{'d': 0}, {'e': 0}],
       '3': [{'d': 0}, {'e': 0}]}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...