Python - 在列表中选择一个字典,哪个键更接近全局值

时间:2017-02-24 15:30:56

标签: python dictionary

我有一系列图像分辨率词典:

[
{'ratio': 1.7777777777777777, 'pixels': 230400, 'key': 'hor_640x360'}, 
{'ratio': 2.1006711409395975, 'pixels': 46637, 'key': 'hor_313x149'}, 
{'ratio': 2.1006711409395975, 'pixels': 746192, 'key': 'hor_1252x596'}
]

我需要选择比率更接近1.77672955975的字典(即float(565) / float(318)的结果),如果比率相等,则选择具有最多像素的字典。换句话说,我需要从列表中选择最大的图像,一旦调整大小并裁剪为565x318,将需要更少的裁剪。

我在考虑对列表进行2次排序,第一次基于像素,第二次基于像素,abs(ratio - (float(565) / float(318)))的结果更小。以这种方式,顶部将保持具有最多像素和最接近的比率匹配的那个。但是怎么做排序?

2 个答案:

答案 0 :(得分:2)

您可以min(..)使用key

matching_dic = min(dicts,key=lambda x:(abs(1.77672955975-x['ratio']),-x['pixels']))

导致:

>>> min(dicts,key=lambda x:(abs(1.77672955975-x['ratio']),-x['pixels']))
{'key': 'hor_640x360', 'pixels': 230400, 'ratio': 1.7777777777777777}

我们的想法是,keylambda x:(abs(1.77672955975-x['ratio']),-x['pixels'])将为每个词典计算您的给定比率(此处为1.77672955975)与此词典的'ratio'之间的差异。我们返回一个元组(-x['pixels']作为打破平局的第二个元素(感谢@MosesKoledoye发现它)。

答案 1 :(得分:2)

按多个属性排序的标准解决方案是使用元组,因为元组按元素排序。

keyfunc= lambda r:(abs(r['ratio']-1.77672955975), -r['pixels'])
print(min(resolutions, key=keyfunc))