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 都是相同形状的 ndarray,并且有一个函数 f(),它返回一个 x ,它是一个浮点数,即:obj_0_0.f() --> x_0_0

我想提取一个字典,其中包含 descrp 和 obj 及其各自的键,其中 obj.f() (即 x)对于每个键中的值是最小值(在 N 个键的 myD 范围内,N 个项目的形状为 [descrp ,对象]):

结果必须类似于:

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 ?

感谢您的帮助和评论。

4

1 回答 1

1

如果我正确理解了您的数据结构,我认为您可以通过调用内置min函数并为其提供key函数的字典理解来解决此问题。

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

你的代码已经很接近了!

于 2013-04-25T11:27:19.040 回答