我有一系列图像分辨率词典:
[
{'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)))
的结果更小。以这种方式,顶部将保持具有最多像素和最接近的比率匹配的那个。但是怎么做排序?
答案 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}
我们的想法是,key
:lambda 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))