我有如下的列表
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记录的最佳方式