2016-10-24 3 views
0

у меня есть список, элементы которого являются словари со значением и поле типа, а именно:сортировать список питон на основе нескольких критериев

my_list = [{'val':5, 'type':0},{'val':6, 'type':2},{'val':2, 'type':1},{'val':9, 'type':0}] 

Я хотел бы отсортировать этот список в порядке убывания, основанный на type поле и внутри каждого типа на основе поля value и получить вектор с соответствующими индексами сортировки вместе с отсортированным вектором.

Я знаю, как сделать это в течение отдельных критериев с использованием lambda функции, т.е .:

sorted_list = sorted(my_list, key=lambda k: k['type'], reverse=True) 

но как продлить ее на несколько критериев?

Желаемая выход:

sorted_list = [{'val':6, 'type':2},{'val':2, 'type':1},{'val':9, 'type':0},{'val':5, 'type':0}] 

sorted_idxs = [1, 2, 3, 0]`, such that `[my_list[k] for k in sorted_idxs]==sorted_list 
+0

Когда у вас есть индексы, вы можете создать отсортированный список самостоятельно. Обратное неверно. –

+1

И ответ, что дубликат не дает вам: http://stackoverflow.com/questions/6422700/how-to-get-indices-of-a-sorted-array-in-python –

ответ

3

Если key возвращает кортеж, sorted будет рассматривать их в порядке, когда сортировка:

In [3]: sorted(my_list, key=lambda k: (k['type'], k['val']), reverse=True) 
Out[3]: 
[{'type': 2, 'val': 6}, 
{'type': 1, 'val': 2}, 
{'type': 0, 'val': 9}, 
{'type': 0, 'val': 5}] 

Если вы хотите, индексы, просто бросить enumerate в там также:

In [7]: sorted(enumerate(my_list), key=lambda k: (k[1]['type'], k[1]['val']), reverse=True) 
Out[7]: 
[(1, {'type': 2, 'val': 6}), 
(2, {'type': 1, 'val': 2}), 
(3, {'type': 0, 'val': 9}), 
(0, {'type': 0, 'val': 5})] 

In [8]: [k for k, v in sorted(enumerate(my_list), key=lambda k: (k[1]['type'], k[1]['val']), reverse=True)] 
Out[8]: [1, 2, 3, 0] 
+1

'sorted_ids, sorted_list = zip (* [(i, x) для сортировки (перечисление (my_list), key = lambda j, d: (d ['type'], d ['val']), reverse = True)]) 'может разделять два в отдельных списках –

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