【发布时间】:2013-11-18 14:08:17
【问题描述】:
我有一个“产品”列表,其中每个人都有两个功能,例如:书籍的价格和评级,或门票的时间和价格等
书籍 (10, 15),其中 10 是美元价格(越便宜越好),15 是从 0 到 100 的评分(越多越好)。
L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]
列表应按价格和评级的最佳组合进行排序。
到目前为止,我有 2 个解决方案,最好的一个是通过乘以 price*(1/rating) 并按此“权重”排序来找到每一对的“权重”,越少越好。
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 指出这一点。我该如何处理异常值,例如一本非常非常糟糕的书,但它非常便宜?我认为应该以某种方式区别对待它们。
【问题讨论】:
-
我觉得第一个已经不错了。为什么你需要一个新算法?
-
第一种方法就够了。但是,您需要处理异常值:例如完全是垃圾但真的很便宜的书(因此单位成本比率很高)和书籍非常好,以至于编辑可以负担得起高价。
-
不一样的
price*(1/rating)=price/rating? -
@georgesl,这是一个非常重要的问题! :) 我需要帮助。