我有一个列表,其元素是带有值和类型字段的字典,即:
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 :(得分: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]