【问题标题】:Making a "ranking" from points with lambda function使用 lambda 函数从点进行“排名”
【发布时间】:2021-11-01 00:14:09
【问题描述】:

假设我有两个列表

future_ranking = [3, 6, 9, 6]
games_played  = [1, 3, 3, 2]

现在我的目标是将其转换为索引排名 [2, 3, 1, 0] 这将是预期的输出。 问题是,我的 lambda 函数做得好吗?

my_cool_lambda = sorted(range(len(future_ranking)), key = lambda x: future_ranking[x], reverse = True)

起初我想,该死的,一切都非常好!总有一天我会成为一名程序员。直到我意识到我很酷的 lambda 函数,当两个分数相同时,它会为先出现的索引给出更高的位置,这不是我想要的。 如果得分相同,则应将较高的位置分配给比赛较少的索引。

所以我得到的输出是

[2, 1, 3, 0]

我想要的输出是

[2, 3, 1, 0]

有谁知道我该如何解决这个问题?我知道问“嘿,你基本上可以为我做这件事吗?”并不酷。但我不知道,我发誓我尝试了很多。

【问题讨论】:

  • 您在帖子中花了很多话进行社交(这里的大多数人宁愿看到您的帖子没有),但在实际解释您要解决的问题上却没有那么多。您是否正在寻找 future_rankinggames_played 的索引,按所玩游戏的排名以及在游戏排名相同的情况下按所玩的大多数游戏排序?
  • 嘿,是的,我正在寻找那个。抱歉社交部分
  • 6/32,而3/13,为什么要[... , 1, 0] 而不是[... , 0, 1]
  • 如果一支球队的比赛次数较少,如果它与另一支球队的积分数相同,则排名更高

标签: python


【解决方案1】:

创建打破平局的排名:

future_ranking_with_tiebreakers = [(rk, -1 * gp) for rk, gp in zip(future_ranking, games_played)]

ranking = sorted(range(len(future_ranking)), key=lambda x: future_ranking_with_tiebreakers[x], reverse=True)
print(ranking)

输出

[2, 3, 1, 0]

变量future_ranking_with_tiebreakers 指向一个元组列表。如果 future_ranking 中的值相同,它将使用第二个组件来打破平局,给那些玩游戏较少的人更多的权重 (-1 * gp)。

阅读this 以更好地了解元组比较的工作原理。

【讨论】:

    【解决方案2】:

    为什么不只运行两次sorted()(按照this helpful SO answer 的规定)以确保对决胜局的正确排序?

    future_ranking = [3, 6, 9, 6]
    games_played  = [1, 3, 3, 2]
    my_cool_lambda = sorted(sorted(range(len(future_ranking)), key = lambda x: games_played[x], reverse = False), key = lambda x: future_ranking[x], reverse = True)
    print(my_cool_lambda) # [2, 3, 1, 0]
    

    Replit

    【讨论】:

      【解决方案3】:

      兼顾这两个方面。

      sorted(range(len(future_ranking)),
             key=lambda x: (-future_ranking[x], games_played[x]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多