如何通过反向对元组进行排序,然后断开非反向的联系?(蟒蛇)

chi*_*man 11 python sorting reverse tuples

如果我有一个元组列表:

results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]
Run Code Online (Sandbox Code Playgroud)

如何在记分板中对列表进行排序 - 这样它会将得分从最大到最小排序,但按名称按字母顺序打破关系?

所以在排序后,列表应如下所示:

results = [('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]
Run Code Online (Sandbox Code Playgroud)

目前我所能做的就是results.sort(reverse=True),但也按字母顺序颠断了...

任何帮助将非常感激.谢谢!

Bak*_*riu 17

实现您想要的最简单方法是使用python排序稳定的事实.这允许首先按字母顺序排序,然后按分数排序:

In [11]: results = [(10, 'Mary'), (9, 'John'), (10, 'George'), (9, 'Frank'), (9, 'Adam')]

In [12]: results.sort(key=lambda x: x[1])

In [13]: results.sort(key=lambda x: x[0], reverse=True)

In [14]: results
Out[14]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]
Run Code Online (Sandbox Code Playgroud)

第一种按字母顺序按升序排序.第二种排序按分数排序,按降序排列,保持元素的相对顺序相等.

您可以这样做以进行更复杂的排序.请记住,您必须先按二级键排序,然后按第一个键排序.(如果你有三个键,首先按第三个键排序,然后按第二个排序,最后按主键排序).

如果你不想打sort两次电话,你将不得不写一个更复杂的key功能.就像是:

In [50]: def key(elem):
    ...:     return elem[0], [-ord(c) for c in elem[1]]

In [51]: sorted(results, key=key, reverse=True)
Out[51]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]
Run Code Online (Sandbox Code Playgroud)

特别是,每次按字典顺序排序时(例如字符串,元组,列表等),您都可以通过将符号更改为所有元素来反转顺序.

  • 值得注意的是,通过使用默认的升序排序并反转数字而不是字符串`sorted(results,key = lambda x:( - x [0),可以避免"单一调用"示例中的一些复杂性],x [1]))` (2认同)

fal*_*tru 6

sort方法接受可选key参数.

key指定一个参数的函数,该函数用于从每个列表元素中提取比较键

您需要将字符串转换为数字:

>>> results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]
>>> results.sort(key=lambda x: (int(x[0]), x[1]), reverse=True)
>>> results
[('10', 'Mary'), ('10', 'George'), ('9', 'John'), ('9', 'Frank'), ('9', 'Adam')]
Run Code Online (Sandbox Code Playgroud)