Сортировать список диктов по х затем у - PullRequest
7 голосов
/ 10 мая 2011

Я хочу отсортировать эту информацию (имя, очки и время):

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 ]

15 голосов
/ 10 мая 2011

Ваш пример работает на меня. Я бы посоветовал вам не использовать list в качестве имени переменной, поскольку это встроенный тип.

Вы также можете попробовать сделать что-то вроде этого:

list.sort(key=lambda item: (item['points'], item['time']))
6 голосов
/ 10 мая 2011

edit:

пример списка:

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

с использованием сортировки для возврата отсортированного списка:

>>> 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'}]
>>> 
3 голосов
/ 10 мая 2011

itemgetter выдаст эту ошибку до Python2.4

Если вы застряли на 2.4, вам нужно будет использовать лямбду

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

Было бы предпочтительнее перейти наболее новый Python, если это возможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...