我需要生成一个这样的字典:
{ 'newEnv': { 'newProj': { 'newComp': { 'instances': [], 'n_thing': 'newThing' } } } }
从一个元组中,如下所示:('newEnv','newProj','newComp','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': []}
这几乎可以正常工作,但不能确定它的效率如何,或者不确定是否应该这样做。有什么建议)??
您可以使用循环(仅使用前三个键,newThing而不是链中的键):
newThing
myDict = {} path = ('newEnv','newProj','newComp') current = myDict for key in path: current = current.setdefault(key, {})
在这里current最终成为最里面的字典,让您在上面设置'n_thing'和'instances'键。
current
'n_thing'
'instances'
您可以用来reduce()将其折叠为单线:
reduce()
myDict = {} path = ('newEnv','newProj','newComp') reduce(lambda d, k: d.setdefault(k, {}), path, myDict)
该reduce调用返回最里面的字典,因此您可以使用它来分配最终值:
reduce
myDict = {} path = ('newEnv','newProj','newComp') inner = reduce(lambda d, k: d.setdefault(k, {}), path, myDict) inner.update({'n_thing': 'newThing', 'instances': []})