如果我有一个元组列表:
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)
,但也会按字母顺序颠断关系......
非常感谢任何帮助。谢谢!
答案 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)按顺序检查元组的优先级