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

标签 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

最佳答案

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

关于python - 根据多个条件对 python 列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40222374/

相关文章:

sql - 如何从包含百万个记录的数据库中选择第一个 'N'记录?

MATLAB 按键对Containers.Map(key, value) 进行排序

c# - 线程和 lambda 表达式

Java 8 嵌套流 : return a value in last stream

python - 如何在浏览器中显示 linux 日志文件中的行

python - 如何将路径(字符串)缩短为仅文件

java - 如何先按 x 然后按 y 对数组或 ArrayList<Point> ASC 进行排序?

java - Java 8 中对多维数组的方法引用

python - 当使用 asyncio.run 单独执行每个迭代时,嵌套的异步到同步生成器在第一次迭代时停止

python - 在opencv中绘制轮廓