嵌套列表中的前 5 个或 N 个列表"using one of the element"嵌套列表中的列表(有点复杂)



我有如下的列表

m=[['abc','x-name',222],['pqr','y-name',333],['mno','j-name',333],['qrt','z-name',111],['dcu','lz-name',999]]

假设我想从这个列表中获得前2名,考虑第三列(即222或其他)

我知道我可以像跟随一样得到Max

>>> m=[['abc','x-name',222],['pqr','y-name',333],['mno','j-name',333],['qrt','z-name',111],['dcu','lz-name',999]]
>>> print max(m, key=lambda x: x[2])
['dcu', 'lz-name', 999]

但是我必须得到前2名(考虑到重复)我的结果应该是

['dcu', 'lz-name', 999] ['pqr','y-name',333] ['mno','j-name',333]

有可能吗?我想弄清楚,你能帮我看看吗?

OR-刚刚有了想法

你可以告诉我删除MAX元素,这样我就可以使用迭代获得前2个元素(尽管重复会有问题)

您可以排序并切片

>>> from operator import itemgetter
>>> sorted(m, key=itemgetter(2), reverse=True)[:3]
[['dcu', 'lz-name', 999], ['pqr', 'y-name', 333], ['mno', 'j-name', 333]]

或者,使用heapq.nlargest():

>>> import heapq
>>> heapq.nlargest(3, m, key=itemgetter(2))
[['dcu', 'lz-name', 999], ['pqr', 'y-name', 333], ['mno', 'j-name', 333]]

不过,这不会很好地处理重复项,而且它不是线性时间复杂性的,而且它会在内存中创建初始列表的排序副本。请参阅以下线程以获得线性时间和更高效的内存解决方案:

  • 在线性时间内获取列表中的第二大数字
  • Python中排序1M记录的最佳方式

最新更新