python - 如何按子列表的第一项然后按第三项对列表列表进行排序
问题描述
我有一个列表列表。例如,
[
[1, 2, 0.10],
[1, 3, 0.22],
[1, 4, 0.20],
[1, 5, 0.37],
[1, 8, 0.60],
[1, 10, 0.01],
[1, 15, 0.26],
[2, 3, 0.28],
[2, 6, 0.12],
[2, 7, 0.72],
[2, 10, 0.77],
[2, 11, 0.36],
...
]
我想按子列表的第一项然后按第三项对列表列表进行排序,并获得每个第一项的前三个结果,该怎么做?谢谢!
结果示例,
[
[1, 15, 0.26],
[1, 5, 0.37],
[1, 8, 0.60],
[2, 11, 0.36],
[2, 7, 0.72],
[2, 10, 0.77],
...
]
解决方案
这是使用itertools.groupby
. 我们使用一个tuple
键按第一项排序,然后反向排序最后一项。
from itertools import groupby
sorter = sorted(A, key=lambda x: (x[0], -x[2]))
grouper = groupby(sorter, key=lambda x: x[0])
res = [list(j)[:3] for _, j in grouper]
print(res)
[[[1, 8, 0.6], [1, 5, 0.37], [1, 15, 0.26]],
[[2, 10, 0.77], [2, 7, 0.72], [2, 11, 0.36]]]
看来您想先降序排序,然后再升序排序。如果这是一个要求,您可以反转结果,即
res = [list(j)[:3][::-1] for _, j in grouper]
感谢@Ev.Kounis 的建议。
推荐阅读
- apache-kafka - Kafka Producer Idempotence - Exactly Once 还是 Just Producer Transaction 就足够了?
- kotlin - 在 kotlin 中压缩 4 个 observables
- c# - Net Core:Startup.Cs 中 .SetBasePath 和 .UseContentRoot 的区别
- angular - 在 Angular App 中实现缓存的最佳方法
- c# - 如何使用 .NET Framework 将数据从 SQL Server 中的另一个表添加到列?
- php - 如何在 PHP 中修复 Localhost 中的“ERR_TOO_MANY_REDIRECTS”
- php - Mobile_Detect 库简化
- asp.net - 我是否正确使用ajax并传递参数。似乎网络方法不起作用
- kubernetes - 删除命名空间中最旧的部署
- c++ - Friend 与成员运算符重载的优先级