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

top 5 or N lists from nested lists "using one of the element" from nested list (little bit complex)

我有如下列表

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

考虑到第 3 列(即 222 等),假设我想从此列表中获得前 2 名

我知道我可以得到像下面这样的 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]

可能吗?我头晕目眩,想弄明白,你能帮我看看吗..

或者 - 刚想到

你可以告诉我删除 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]]

但是,这不能很好地处理重复项,并且它不是线性时间复杂度,而且它会在内存中创建初始列表的排序副本。请参阅以下主题以了解线性时间和更节省内存的解决方案:

  • Get the second largest number in a list in linear time
  • Best way to sort 1M records in Python