Перебирать список в обратном порядке и создавать динамические словари - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать большой диктат, который инкапсулирует диктанты из списка ключей: у меня есть следующий список:

lis = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']

Я могу перебрать этот список в обратном порядке, но не могусоздать этот большой объект

здесь вывод, который я хочу:

  {'model': {'properties': {'config': {'properties': {'zookeeperStorageSize': {'default': '50m'}}}}}} 

какие-либо выводы?

Ответы [ 3 ]

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

Это функциональное решение, использующее collections.defaultdict для создания вложенного defaultdict defaultdicts:

from collections import defaultdict
from functools import reduce
from operator import getitem

tree = lambda: defaultdict(tree)
d = tree()

def getFromDict(dataDict, mapList):
    """Iterate nested dictionary"""
    return reduce(getitem, mapList, dataDict)

lis = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']

getFromDict(d, lis[:-1])[lis[-1]] = '50m'

print(d['model']['properties']['config']['properties']['zookeeperStorageSize']['default'])
# 50
0 голосов
/ 23 мая 2018

Пример.

mylist = ['model', 'properties', 'config', 'properties',    'zookeeperStorageSize', 'default']

dict1 = {}
for key in reversed(mylist):
  if mylist.index(key) == len(mylist)-1:
     dict1 = {key: '50m'}
  else:
     dict1 = {key: dict1}
print dict1

O /P:

{'model': {'properties': {'config': {'properties':{'zookeeperStorageSize': {'default': '50mb'}}}}}}
0 голосов
/ 23 мая 2018

вот мое решение:

def listtodict(mylist, final_value):
    if len(mylist) == 1:
        return {mylist[0]:final_value}
    else:
        return {mylist[0]:listtodict(mylist[1:], final_value)}

mylist = ['model', 'properties', 'config', 'properties', 'zookeeperStorageSize', 'default']
print(listtodict(mylist, "50m"))

отпечатки:

{'model': {'properties': {'config': {'properties': {'zookeeperStorageSize': {'default': '50m'}}}}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...