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

时间:2013-08-24 04:42:15

标签: python sorting tuples reverse

如果我有一个元组列表:

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

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

因此,排序后,列表应如下所示:

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

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

非常感谢任何帮助。谢谢!

4 个答案:

答案 0 :(得分: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')]

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

您可以执行此操作以执行更复杂的排序。请记住,您必须首先按 secondary 键排序,然后按第一个键排序。 (如果你有三个键,首先按第三个键排序,然后按第二个排序,最后按主键排序。)

如果您不想两次致电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')]

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

答案 1 :(得分:6)

sort方法接受可选的key参数。

  

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

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

>>> 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')]

答案 2 :(得分:0)

您可以非常精细地控制如何使用sort方法的key参数对元组中的每个值进行排序。例如:

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')]

答案 3 :(得分:-1)

只需使用sorted就足够了

>>> sorted(results)
[('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]

默认cmp函数通过比较元组的每个成员(从0到n)按顺序检查元组的优先级