当出现条件时,从嵌套列表字典返回对象(python)

当出现条件时,从嵌套列表字典返回对象(python),python,list,object,dictionary,numpy,Python,List,Object,Dictionary,Numpy,我有一本字典,看起来像: 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,该x是一个浮点值,即: obj_0_0.f()-->x_0_0 我想提取一个包含descrp和o

我有一本字典,看起来像:

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,该x是一个浮点值,即: obj_0_0.f()-->x_0_0

我想提取一个包含descrp和obj及其各自键的字典,其中obj.f()(即x)是每个键中值的最小值(在myD范围内,N个键将给出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]
比如:

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来实现这个目的


感谢您的帮助和评论。

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

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

你的代码已经很接近了

您的词典是否在每个值的开头缺少一个
[
字符?也就是说,键
key\u 0
是否对应于整个列表
[['descrp\u 0\u 0']、Obj\u 0]、…、['descrp\u 0\u N']、Obj\u 0\u N]
(注意我添加的额外的
[
),或者仅仅是第一项?它对应于整个列表。正如您所说,需要一个额外的括号,所以我编辑了它。谢谢您的回答和有效的方法。但是,这似乎忽略了数组中的一层,即myD。values()[I][j][1]是具有f()函数的对象。我尝试过:
results={key:min](value,key=lambda x:x[i][1].f()表示key,myD中的值。iteritems()表示值中的i}
在第一次出现“for”时再次抛出语法错误。@AliRafieefar:我不确定我是否理解您所说的额外层。字典是最外层,我们在理解中显式地迭代它。
列表是下一个最内层,由 min。其中的项目也是列表,比如
[['Descriptip_0_0'],Obj_0_0]
,这是lambda索引的内容。我的代码中确实有一个输入错误(
而不是
)。这可能是您遇到的问题吗?关于层,您是对的。我发现,因为我使用的是Python 2.6,字典理解的语法必须是:
results=dict((key,min(value,key=lambda x:x[-1].f())对于key,myD.iteritems()中的值)
谢谢