2014-02-26 103 views
0

它必须是一件简单的事情,但不能让我的头靠近它。我的剧本的部分做到这一点:如何创建一个多级字典

myDict = {} 
for dev in self.dmd.Devices(): 
    device = dev.id 
    collector = dev.getPerformanceServerName() 
    instances = [ inst.id for inst in dev.instances() ] 

,并从那里,我想创建这样一个字典:

{ 
    "EC2-test-eip-alloc": { 
     "mon511.backbc.local": [ 
      "i-1828ca57", 
      "i-372d3978" 
     ] 
    } 
    .... 
    .... 
} 

其中EC2测试-EIP-ALLOC =>devicemon511 .backbc.local =>collector[“i-1828ca57”,“i-372d3978”] =>instances。我试着用:

inDict = reduce(lambda d, k: d.setdefault(k, {}), device, myDict) 
inDict.setdefault(collector, instances) 

,但得到一个非常奇怪的结果,其中device每个字符被视为关键,就像这样: {"E":{"C":{"2":{"-":{...}}}}}。任何想法我怎么能得到这个东西是正确的?干杯!!

+0

'reduce'迭代'device',这是一个字符串。不知道如何解决它,但也许有帮助。 – colcarroll

+1

在'reduce'中,可以将'device'封装在一个元组中:'(device,)' – wflynny

+0

@ Bill:谢谢!我已经尝试了'(设备)',但最后还是没有'',''。工作得很好。干杯!! – MacUsers

回答

1

为了重申我的意见的上方,改变

inDict = reduce(lambda d, k: d.setdefault(k, {}), device, myDict) 

inDict = reduce(lambda d, k: d.setdefault(k, {}), (device,), myDict) 

,使得通过减少('device',)迭代(其产生'device', StopIteration)代替 '装置'(其产生'd', 'e', 'v', 'i', 'c', 'e', StopIteration)。