我如何按相反的顺序对元组排序,而不按相反的顺序断开连接?(Python)
如果我有一个元组列表:我如何按相反的顺序对元组排序,而不按相反的顺序断开连接?(Python),python,sorting,tuples,reverse,Python,Sorting,Tuples,Reverse,如果我有一个元组列表: results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')] 我怎样才能像你在记分板上看到的那样对列表进行排序——这样它就可以将分数从最大到最小排序,但却可以按名称的字母顺序打破联系 因此,排序后,列表应如下所示: results = [('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Fr
results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]
我怎样才能像你在记分板上看到的那样对列表进行排序——这样它就可以将分数从最大到最小排序,但却可以按名称的字母顺序打破联系
因此,排序后,列表应如下所示:
results = [('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]
目前我所能做的就是结果。排序(reverse=True)
,但也会按字母顺序倒序
任何帮助都将不胜感激。谢谢 仅使用排序的
就足够了
>>> sorted(results)
[('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]
默认cmp
函数通过比较元组的每个成员(从0到n)来检查元组的优先级,顺序为排序
方法接受可选的键
参数
键指定一个参数的函数,该参数用于提取
每个列表元素的比较键
您需要将字符串转换为数字:
>>> 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')]
实现您想要的最简单的方法是使用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')]
第一种排序按字母顺序升序排序。第二种排序是按分数按降序排序,以保持分数相等的元素的相对顺序
您可以这样做来进行更复杂的排序。请记住,您必须首先按次键排序,然后按第一个键排序。(如果有三个键,首先按第三个键排序,然后按第二个键排序,最后按主键排序)
如果不想调用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')]
特别是,每次按字典顺序排序时(如字符串、元组、列表等),都可以通过将符号更改为所有元素来颠倒顺序。您可以通过排序
方法的键
参数对元组中的每个值进行非常精细的排序控制。例如:
In [41]: results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]
In [42]: results.sort(key=lambda (score, name): (-int(score), name))
In [43]: results
Out[43]:
[('10', 'George'),
('10', 'Mary'),
('9', 'Adam'),
('9', 'Frank'),
('9', 'John')]
'10'<'9'是真的
,'Adam'
。我猜你想把'10'>'9'
?为什么你的数字用字符串而不是整数?这是一个很好的观点!!我没有想到这一点。现在我所有的数字都是整数,但我仍然不确定如何对反向和非反向进行排序…啊,我明白了-问题是,如果这些数字是其他数字,这就行不通了。。。坏例子我想:)Sorry可能值得注意的是,您可以通过使用默认的升序排序并反转数字而不是字符串排序(results,key=lambda x:(-x[0],x[1])来避免“一次排序调用”示例中的一些复杂性。