【问题标题】:How to sort a list of lists by the first item of the sub-list then by the third item如何按子列表的第一项然后按第三项对列表列表进行排序
【发布时间】:2018-06-04 08:52:13
【问题描述】:

我有一个列表列表。例如,

[ 
[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],
...
]

【问题讨论】:

  • 你的问题不清楚。 “每个第一个索引的第三个元素”是什么意思?实际上,这里的“索引”是什么意思?在您的示例输出中,它看起来主要按子列表的第一项排序,然后按第三项排序。你是这个意思吗?也不清楚“每个第一个索引的前三个结果”是什么意思,您也没有为此提供示例。为了清楚起见,请编辑您的问题。
  • @RoryDaulton 感谢您的建议。

标签: python list sorting


【解决方案1】:

这是使用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 的建议。

【讨论】:

  • res = [list(j)[:3][::-1] for _, j in grouper] 也应该可以工作。
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多