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