【问题标题】:Python - Sorting with saved sorting orderPython - 使用保存的排序顺序进行排序
【发布时间】:2020-04-28 21:25:42
【问题描述】:

我在 python 方面非常基础,我遇到了一个小问题,我看不到解决方案:

我有一个Player 类的列表,其中有:

class player:
    def __init__(self,name,wins,points):
        self.name = name
        self.wins = wins
        self.points = points

稍后在制作包含数据的列表后,我需要按特定顺序排序:

  • wins降序排列
  • 如果在wins 中绘制,则按points 降序排列
  • 如果在points 中绘制,则按name 升序排序

我尝试了下一个解决方案的变体(失败了):

players.sort(key=lambda x: x.name)
players.sort(key=lambda x: x.points)
players.reverse()
players.sort(key=lambda x: x.wins)
players.reverse()

但在此之后我的订单有点问题(虽然wins 相等)...例如:

我有下一个数据:

list({name:"Artur", points:20, wins:1},
     {name:"Jan", points:25, wins:1},
     {name:"Karol", points:10, wins:0})

排序后我需要下一个订单:

Jan
Artur
Karol

但我提出的解决方案部分错误:
结果:

Artur
Jan
Karol

为什么是部分?在最终反转之前它有正确的顺序:

"Karol"
"Jan"   #\this group
"Artur" #/ is in right positions

那么有一些解决方案吗?或者我只是“无法从 Internet 上找到解决方案”-man?

【问题讨论】:

    标签: python python-3.x list class sorting


    【解决方案1】:

    我不确定您为什么要为此使用 lambda,但是您需要添加条件以查找两个玩家是否具有相同的分数,如果这些条件匹配,则运行额外的排序,然后为最终排序添加另一个条件。现在,您只是按照列表中的最后一个条件对所有内容进行排序。您可能必须使用 forloop 来检查类中的下一个值与当前值。

    【讨论】:

      【解决方案2】:

      好的,抱歉打扰了,但我自己找到了解决方案...
      改变 1 行的位置很简单:

      players.sort(key=lambda x: x.name)
      players.reverse() #this one...
      players.sort(key=lambda x: x.points)
      players.sort(key=lambda x: x.wins)
      players.reverse()
      

      再次抱歉打扰...

      【讨论】:

        【解决方案3】:

        您应该能够通过返回一个元组来使用一种排序并使用 lambda 函数:

        players.sort(key=lambda x: (-x.wins, -x.points, x.name))
        

        请注意,负值用于按降序排序。

        【讨论】:

          猜你喜欢
          • 2011-05-20
          • 2016-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-19
          • 2012-12-03
          • 1970-01-01
          • 2010-12-21
          相关资源
          最近更新 更多