2013-04-25 47 views
3

我有一個字典,看起來像:返回對象時的條件(蟒)

myD={'key_0':[[['descrp_0_0'],Obj_0_0],.....,[['descrp_0_N'],obj_0_N]] 
,....., 
'key_N':[[['descrp_N_0'],Obj_N_0],.....,[['descrp_N_N'],obj_N_N]]} 

所有OBJ文件具有相同的形狀的ndarrays和具有函數f()返回的x這是一個浮即: obj_0_0.f() - > x_0_0

我想提取與descrp和OBJ以及它們各自的鍵,其中obj.f()(即x)爲最小的值的字典在每個密鑰中(在N個密鑰的myD範圍中將給出N個項目,形狀爲[descrp,obj]):

結果必須是這個樣子:

resD = {'key_0':[[descrp_0_min],obj_0_min], 
    ....., 
    'key_N':[[descrp_N_min],obj_0_min]} 

喜歡的東西:

minXs = [min([item[-1].f() for item in v]) for k,v in myD.iteritems()] 

minObjs = [item for k,v in myD.iteritems() for item in v if item[-1].get_potential_energy() == minXs[myD.keys().index(k)]] 

resultList = zip(myD.keys(),minObjs) 
resultDict = dict() 
for i in resultList: 
    resultDict[i[0]]=i[1] 

雖然它的工作原理,但相當麻煩,我想一定要做到這一點更簡單的方法。或者,也許我應該使用numpy.ndarray爲此目的?

我感謝您的幫助和評論。

+0

你的字典是否在每個值的開頭都缺少一個'[''字符?也就是說,key_0對應整個列表[[['descrp_0_0'],Obj_0_0],.....,[['descrp_0_N'],obj_0_N]]'(注意額外的'['我已經添加了),還是隻是第一個項目? – Blckknght 2013-04-25 11:21:47

+0

它對應於整個列表。你所說的額外括號是需要的,所以我編輯了它。謝謝 – ARaf 2013-04-25 14:40:11

回答

1

如果我已經正確理解了你的數據結構,我認爲你可以通過字典理解來解決這個問題,該理解調用內建的min函數並給它一個函數key

results = {key: min(values, key=lambda x:x[-1].f()) 
      for key, values in myD.iteritems()} 

您的代碼已經非常接近了!

+0

嗨,謝謝你的回答和有效的方法。但是,這似乎忽略了數組中的一個層,即** myD.values()[i] [j] [ - 1] **是具有f()函數的對象。我試過了: '結果= {key:min(values,key = lambda x:x [i] [ - 1] .f()for key,myD.iteritems()for i in values}' 在第一個'for'處再次拋出一個SyntaxError – ARaf 2013-04-25 14:43:02

+0

@AliRafieefar:我不確定是否理解你正在討論的額外層,字典是最外層,我們正在明確地迭代它'values'列表是下一個最內層,它由'min'隱式地迭代,其中的內容也是列表,如[['descrip_0_0'],Obj_0_0]'這就是lambda索引。我的代碼中有一個輸入錯誤('value'而不是'values'),這可能是你正在碰到的問題嗎? – Blckknght 2013-04-25 23:34:54

+0

你說得對,因爲我使用Python 2.6,字典理解必須是: ' results = dict((key,min(values,key = lambda x:x [-1] .f()))for myD.iteritems()) – ARaf 2013-05-02 15:59:07