小编典典

使用列表/元组元素作为关键字创建字典

python

我需要生成一个这样的字典:

{
  'newEnv': {
     'newProj': {
        'newComp': {
           'instances': [],
           'n_thing': 'newThing'
        }
     }
  }
}

从一个元组中,如下所示:('newEnv','newProj','newComp','newThing')但仅当它尚不存在时。所以,我尝试了这个:

myDict = {}
(env,proj,comp,thing) = ('newEnv','newProj','newComp','newThing')

if env not in myDict:
    myDict[env] = {}
if proj not in myDict[env]:
    myDict[env][proj] = {}
if comp not in myDict[env][proj]:
    myDict[env][proj][comp] = {'n_thing': thing, 'instances': []}

这几乎可以正常工作,但不能确定它的效率如何,或者不确定是否应该这样做。有什么建议)??


阅读 223

收藏
2020-12-20

共1个答案

小编典典

您可以使用循环(仅使用前三个键,newThing而不是链中的键):

myDict = {}
path = ('newEnv','newProj','newComp')
current = myDict
for key in path:
    current = current.setdefault(key, {})

在这里current最终成为最里面的字典,让您在上面设置'n_thing''instances'键。

您可以用来reduce()将其折叠为单线:

myDict = {}
path = ('newEnv','newProj','newComp')
reduce(lambda d, k: d.setdefault(k, {}), path, myDict)

reduce调用返回最里面的字典,因此您可以使用它来分配最终值:

myDict = {}
path = ('newEnv','newProj','newComp')
inner = reduce(lambda d, k: d.setdefault(k, {}), path, myDict)
inner.update({'n_thing': 'newThing', 'instances': []})
2020-12-20