根据多个条件对python列表进行排序

时间:2016-10-24 15:41:09

标签: python sorting lambda

我有一个列表,其元素是带有值和类型字段的字典,即:

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

1 个答案:

答案 0 :(得分:5)

如果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]