2013-02-27 2 views
1

У меня есть список списков,Различные порядок сортировки по различным элементам в списке списка

MyList = [[ 'ZZZ', 100], [ 'SSS', 100], [ '555' , 100], [ '222', 100], [ '333', 90]]

Это отсортированный (по убыванию) список на основе, основанный на использовании следующей функции

отсортировано (mylist, key = lambda x: (x [1], x [0]), reverse = True)

Я хочу разобраться в этом таким образом, чтобы я получаю следующий порядок

[[ '222', 100], [ '555', 100], [ 'SSS', 100], [ 'ZZZ', 100], [ '333', 90]]

, что сортируется desc заказ на оценки х [1], где в качестве asc порядка на значениях х [0]

ответ

6

Вы близким и удачливым.

Повезло, потому что:

У вас есть по-крайней мере, одно числовое значение, что вы можете свести на нет, чтобы создать другой порядок

Закрыть потому,

вот что вы пропали без вести

>>> mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['333',90]] 
>>> sorted(mylist, key = lambda e: (-e[1], e[0])) 
[['222', 100], ['555', 100], ['sss', 100], ['zzz', 100], ['333', 90]] 
>>> 
3

Это легко, если вам нужно изменить порядок числового поля, просто отрицайте его

>>> mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['333',90]] 
>>> sorted(mylist, key=lambda x:(-x[1], x[0])) 
[['222', 100], ['555', 100], ['sss', 100], ['zzz', 100], ['333', 90]] 

Если бы вам пришлось сортировать, например, двух строковых полей, один восходящий и один нисходящий это not quite so easy

3

В том случае, если вы не можете использовать отрицанием, например, все элементы строки, вы можете создать сравнить функцию и использовать functools.cmp_to_key, чтобы преобразовать ее в ключевую функцию.

from functools import cmp_to_key 
mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['222',90]] 
def f(a, b): 
    return cmp(a[0], b[0]) or -cmp(a[1], b[1]) 
sorted(mylist, key=cmp_to_key(f)) 
+0

Стоит упомянуть, что это не используется в этом специальном случае, так как это вызывает функцию func, вызываемую больше раз - поэтому она медленнее –

Смежные вопросы