以相反的顺序迭代列表并创建动态字典

2024-04-20 04:55:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个大dict,它将dict封装在一个键列表中: 我有以下清单:

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

我可以按相反的顺序迭代这个列表,但是我不能创建这个大对象

这里是我想要的输出:

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

有线索吗?你知道吗


Tags: 对象configdefault列表model顺序propertiesdict
3条回答

这是一个函数式解决方案,使用collections.defaultdict创建defaultdict的嵌套defaultdict:

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
  • reversed函数返回一个反向迭代器。你知道吗

例如

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

output_dict = {}
for key in reversed(mylist):
  if mylist.index(key) == len(mylist)-1:
     output_dict = {key: '50m'}
  else:
     # re-assign output_dict value
     output_dict = {key: output_dict}
print output_dict

O/p:

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

以下是我的解决方案:

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'}}}}}}

相关问题 更多 >