2013-08-19 3 views
0

Мне нужно отсортировать список имен на основе числа, с которым они связаны. Пример данных у меня есть:Python 3.3.2 - Сортировка списка имен на основе номера

[['Bob Person', 10], ['Josh Winner', 15], ['Jimmy Dexter', 5], ['Mary Goodsprings', 15]] 

Нормальный вроде бы это сделать:

[['Bob Person', 10], ['Jimmy Dexter', 5], ['Josh Winner', 15], ['Mary Goodsprings', 15]] 

Рода я хочу провести, должен быть основан на наибольшее число их в сочетании с. Но, если числа равны, тогда он должен прибегать к именам. Как это:

[['Josh Winner', 15], ['Mary Goodsprings', 15], ['Bob Person', 10], ['Jimmy Dexter', 5]] 

Обратите внимание, как Мэри и Джош оба связаны, но Джош еще фронт, потому что J предшествует М.

У меня довольно много ни малейшего понятия о том, как это сделать, кроме факт, что я должен использовать функцию key от sort().

+0

У вас есть ошибка в примере «нормальной сортировки», следует заменить первый и второй предметы –

ответ

6

Используйте -item[1] для сортировки в порядке убывания, с item[0] для ссылок на номера.

>>> data = [['Bob Person', 10], ['Josh Winner', 15], ['Jimmy Dexter', 5], ['Mary Goodsprings', 15]] 
>>> sorted(data, key=lambda item: (-item[1], item[0])) 
[['Josh Winner', 15], ['Mary Goodsprings', 15], ['Bob Person', 10], ['Jimmy Dexter', 5]] 
0

Поскольку Python рода есть guaranteed to be stable (это означает, что порядок сохраняется при несколько элементов имеют один и тот же ключ), вы можете отсортировать список в нескольких прогонов. Самый важный критерий - последний.

import operator 

data = [['Bob Person', 10], ['Josh Winner', 15], ['Jimmy Dexter', 5], ['Mary Goodsprings', 15]] 
data.sort() 
data.sort(key=operator.itemgetter(1), reverse=True)