2014-02-26 59 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)。