我有“产品”列表,其中每个人都有两个功能,例如:书籍的价格和评级,或门票的时间和价格等
书籍(10,15),其中10是以美元计价的价格(越便宜越好),15是从0到100的评级(越多越好).
L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]
该列表应按价格和评级的最佳组合进行排序.
到目前为止我有2个解决方案,最好的方法是通过乘以价格*(1 /等级)并按这个“重量”排序来找到每对的“重量”,越少越好.
res1 = {}
for i in L:
res1[i] = i[0]*(1./i[1])
# {(10, 40): 0.25, (20, 70): 0.2857, (50, 15): 3.3333, (76, 30): 2.5333, (150, 100): 1.5}
sorted(res1, key=lambda x: res1[x])
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]
第二种解决方案更复杂,代表性更低.它需要排序两次 – 按价格和评级(评级 – 反转)并试图找到匹配. “权重”将是第一个排序列表中的索引与第二个排序列表中的索引相乘(或求和).
L1 = sorted(L, key=lambda x: x[0])
L2 = sorted(L, key=lambda x: x[1], reverse=True)
res = {}
for i in L:
res[i] = (L1.index(i)+1) * (L2.index(i)+1)
res
# {(10, 40): 3, (20, 70): 4, (50, 15): 15, (76, 30): 16, (150, 100): 5}
sorted(res, key=lambda x: res[x])
# [(10, 40), (20, 70), (150, 100), (50, 15), (76, 30)]
当使用具有大量数据的第二变体时,它显示出较少代表性的结果.
但我厌倦了发明一个轮子,你可以建议哪些数学和算法解决方案?有趣的是,如果这个问题有3个或更多功能的解决方案:价格,供应时间,重量,评级等.
更新:感谢@georgesl指出这一点.我怎么能处理异常值,例如一本非常糟糕的书,但它很便宜?我认为应该以不同的方式对待它们.
解决方法:
为什么你不能那样结合你的答案
L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]
sorted(L, key=lambda x: x[0] / (x[1] * 1.0))
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]
附:如果你想得到浮动回答最好的方法乘以1.0数字.它比在浮动中划分或运行你的数字更快
标签:python,algorithm,sorting