当出现条件时,从嵌套列表字典返回对象(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:我不确定我是否理解您所说的额外层。字典是最外层,我们在理解中显式地迭代它。值
列表是下一个最内层,由[['Descriptip_0_0'],Obj_0_0]
,这是lambda索引的内容。我的代码中确实有一个输入错误(值而不是值)。这可能是您遇到的问题吗?关于层,您是对的。我发现,因为我使用的是Python 2.6,字典理解的语法必须是:results=dict((key,min(value,key=lambda x:x[-1].f())对于key,myD.iteritems()中的值)
谢谢