按x排序,然后按y排序

时间:2011-05-10 02:50:43

标签: python list sorting

我想对此信息(名称,点和时间)进行排序:

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

所以,我想要的是按照制作的点数排序的列表,然后按时间播放(在我的例子中,因为他的时间较少,所以首先是因为他没有帮助吗?

我正在尝试这个:

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

但获得TypeError: list indices must be integers, not str

3 个答案:

答案 0 :(得分:15)

你的例子适合我。我建议你不要使用list作为变量名,因为它是内置类型。

您也可以尝试这样做:

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

答案 1 :(得分:6)

修改

示例列表:

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

答案 2 :(得分:3)

itemgetter会将此错误抛到Python2.4

如果您遇到2.4,则需要使用lambda

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

如果可能的话,最好升级到更新的Python