2011-12-22 65 views
1

我有一個這樣的字典具有如下的數據結構:有什麼快速的方法來修改這種字典?

{'index_1':[('time_1',[ ['a',1],['b',1],['c',1] ]), 
      ('time_2',[ ['a',100],['c',100] ]), 
      ('time_3',[ ['a',200],['b',200],['c',200] ]), 
      ('someting_time', [ ['something_name','something_val'] ... ]) 
      ], 
'index_2':['something same as above' ] 
} 

這主要是由「time_x」索引。但我真的想改變字典爲以下風格:

{'index_1':{'a':{'time_1':1,'time_2':100,'time_3':200}, 
      'b':{'time_1':1,'time_2':'NO_VAL','time_3",200}, 
      .... 
      .... 
} 

有沒有任何快速的方法來做到這一點改變?我可以查看每個列表/字典,但由於查找操作更加相同,我必須考慮性能或數據結構。

感謝

+0

「我可以順利通過每個列表/字典」。那有什麼問題?這是你已有的數據結構。字典查找使用散列並且是** O **(1)。你怎麼可能改進呢? – 2011-12-22 03:16:03

+0

Thx,原始字典是基於「列表」的字體字典。將建立新的字典會造成一些性能問題?基本上我想計算平均數,例如:(time_1(b)-time_2(b))/(time_1 - time-2),這就是爲什麼我想修改原始數據結構。 – user1110921 2011-12-22 03:48:33

+0

爲什麼一些神奇的''NO_VAL''不變?爲什麼不把鑰匙留下?處理將在稍後使用數據的代碼中處理缺少的密鑰是微不足道的。 – 2011-12-22 04:58:17

回答

1

我不知道有任何更快的方法來重新組織的字典比使用循環經歷的一切。我發現如果你有真正複雜的字典條目,你可能應該使用一個類。

這裏有一個快速的代碼片段來做你所問的。它不會執行'NO_VAL',但如果time_x不在那裏,您可以很容易地嘗試除KeyError以外的其他操作。

a={'index_1':[('time_1',[ ['a',1],['b',1],['c',1] ]),('time_2',[ ['a',100],['c',100] ]),('time_3',[ ['a',200],['b',200],['c',200] ])],'index_2':[('time_1',[ ['a',1],['d',1],['c',1] ]),('time_2',[ ['a',100],['c',100] ]),('time_3',[ ['a',200],['b',200],['c',200] ])]} 

d={} 

for key in a.keys(): 
    d[key]={} 
    for time in a[key]: 
     for name in time[1]: 
      if name[0] in d[key]: 
     d[key][name[0]][time[0]]=name[1] 
      else: 
       d[key][name[0]]={time[0]:name[1]} 


print d 
+0

是的,我正在考慮改變原來的字典,實際上它是與重新塊匹配生成的。 – user1110921 2011-12-22 04:04:33