按x然后y对字典列表进行排序

17 投票
3 回答
10280 浏览
提问于 2025-04-16 17:19

我想对这些信息(名字、分数和时间)进行排序:

list = [
    {'name':'JOHN', 'points' : 30, 'time' : '0:02:2'},
    {'name':'KARL','points':50,'time': '0:03:00'}
]

所以,我想要的是先按分数排序,然后再按游戏时间排序(在我的例子中,matt 排在前面,因为他的游戏时间更少)。有什么帮助吗?

我正在尝试这个:

import operator
list.sort(key=operator.itemgetter('points', 'time'))

但出现了一个错误:TypeError: list indices must be integers, not str

3 个回答

3

在Python 2.4之前,使用itemgetter会出现这个错误。

如果你只能用2.4版本,那你就得用lambda这个方法。

my_list.sort(key=lambda x: (x['points'], x['time']))

如果有可能的话,最好还是升级到更新的Python版本。

9

编辑:

示例列表:

>>> a = [
...     {'name':'JOHN', 'points' : 30, 'time' : '0:02:20'},
...     {'name':'LEO', 'points' : 30, 'time': '0:04:20'},
...     {'name':'KARL','points':50,'time': '0:03:00'},
...     {'name':'MARK','points':50,'time': '0:02:00'},
... ]

降序排列的“分数”:

使用 sort() 进行原地排序:

>>> a.sort(key=lambda x: (-x['points'],x['time']))
>>> pprint.pprint(a)
[{'name': 'MARK', 'points': 50, 'time': '0:02:00'},
 {'name': 'KARL', 'points': 50, 'time': '0:03:00'},
 {'name': 'JOHN', 'points': 30, 'time': '0:02:20'},
 {'name': 'LEO', 'points': 30, 'time': '0:04:20'}]
>>> 

使用 sorted 返回一个排序后的列表:

>>> pprint.pprint(sorted(a, key=lambda x: (-x['points'],x['time'])))
[{'name': 'MARK', 'points': 50, 'time': '0:02:00'},
 {'name': 'KARL', 'points': 50, 'time': '0:03:00'},
 {'name': 'JOHN', 'points': 30, 'time': '0:02:20'},
 {'name': 'LEO', 'points': 30, 'time': '0:04:20'}]
>>> 

升序排列的“分数”:

>>> a.sort(key=lambda x: (x['points'],x['time']))
>>> import pprint
>>> pprint.pprint(a)
[{'name': 'JOHN', 'points': 30, 'time': '0:02:20'},
 {'name': 'LEO', 'points': 30, 'time': '0:04:20'},
 {'name': 'MARK', 'points': 50, 'time': '0:02:00'},
 {'name': 'KARL', 'points': 50, 'time': '0:03:00'}]
>>> 
28

你的例子对我来说是有效的。我建议你不要把list用作变量名,因为它是一个内置类型。

你也可以试试这样做:

list.sort(key=lambda item: (item['points'], item['time']))

撰写回答