考虑一个类 Team,类变量为“wins”和“loss”。我希望按胜负比对一组团队进行排序,这样:
5:0 > 3:0 > 1:0 > 3:1 > 5:5 > 3:3 > 1:3 > 0:1 > 0:3 > 0:5
我已经有了一个(部分)拼凑的解决方案,我对此并不满意,我想知道是否有更清洁/更优雅/更简单的方法来解决这个问题。
def ratio
if @losses == 0 then
return 1000000+@wins
end
if @wins == 0 then
return 0-@losses
end
return @wins/@losses
end
(这不能解决 5:5 > 3:3)
这将在 Team 类中并且可以像这样使用:
teams.sort! { |a, b| b.ratio <=> a.ratio }
解决这个问题最简单的方法是什么? (解决方案不一定是 Ruby,我对任何面向对象的东西都很满意)
最佳答案
我不会说 Ruby,但是可以提供您想要的结果的 Python 方法会使用元组作为键(在 decorate-sort-undecorate “Schwartzian transform”惯用语中。)
例如,您可以按获胜分数排名,然后是获胜次数,然后是(负)失败次数,这将给出您想要的顺序:
>>> wl = [[3, 0], [3, 1], [0, 5], [3, 3], [0, 3], [5, 5], [1, 3], [5, 0]]
>>>
>>> def rank(wl):
... win, loss = wl
... return (1.0*win/(win+loss) if win+loss > 0 else 0), win, -loss
...
>>> sorted(wl, key=rank)
[[0, 5], [0, 3], [1, 3], [3, 3], [5, 5], [3, 1], [3, 0], [5, 0]]
>>> sorted(wl, key=rank)[::-1]
[[5, 0], [3, 0], [3, 1], [5, 5], [3, 3], [1, 3], [0, 3], [0, 5]]
不幸的是,我不知道 Ruby 的等价物是什么,但我收集到有一个 sort_by
方法在某处 float 。
关于ruby - 如何在避免被零除的同时按比率排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530264/