Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何按相反的顺序对元组排序,而不按相反的顺序断开连接?(Python)_Python_Sorting_Tuples_Reverse - Fatal编程技术网

我如何按相反的顺序对元组排序,而不按相反的顺序断开连接?(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])来避免“一次排序调用”示例中的一些复杂性。