嵌套列表中的前 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
我有如下列表
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