如何从python中的列表列表中获取n个最大的列表

如何从python中的列表列表中获取n个最大的列表,python,Python,我正在使用heapq从列表列表中获取最大的元素。我写的程序如下 import csv import heapq f = open("E:/output.csv","r") read = csv.reader(f) allrows = [row for row in read] for i in xrange(0,2): print allrows[i] allrows.sort(key=lambda x: x[2]) #this is working properly it=he

我正在使用heapq从列表列表中获取最大的元素。我写的程序如下

import csv
import heapq
f = open("E:/output.csv","r")
read = csv.reader(f)

allrows = [row for row in read]

for i in xrange(0,2):
     print allrows[i]

allrows.sort(key=lambda x: x[2]) #this is working properly
it=heapq.nlargest(20,enumerate(allrows),key=lambda x:x[2]) #error
我只想要前20个元素。因此,我考虑使用堆来代替排序。我得到的错误是

  Traceback (most recent call last):
File "D:\eclipse_progs\DaDv\IMDB\Assignment1.py", line 42, in <module>
  it=heapq.nlargest(2,enumerate(allrows),key=lambda x:x[2])
File "C:\Python27\lib\heapq.py", line 470, in nlargest
  result = _nlargest(n, it)
File "D:\eclipse_progs\DaDv\IMDB\Assignment1.py", line 42, in <lambda>
  it=heapq.nlargest(2,enumerate(allrows),key=lambda x:x[2])
IndexError: tuple index out of range
回溯(最近一次呼叫最后一次):
文件“D:\eclipse\u progs\DaDv\IMDB\Assignment1.py”,第42行,在
it=heapq.nlargest(2,枚举(所有行),key=lambda x:x[2])
文件“C:\Python27\lib\heapq.py”,第470行,NLAGEST中
结果=\ n最大值(n,it)
文件“D:\eclipse\u progs\DaDv\IMDB\Assignment1.py”,第42行,在
it=heapq.nlargest(2,枚举(所有行),key=lambda x:x[2])
索引器错误:元组索引超出范围
我能知道为什么会出现错误以及如何解决它吗。是否缺少使用heapq的任何属性。

enumerate()
返回超过2元组的iterable。因此,在第二个示例中访问
x[2]
总是超出范围(唯一有效的索引是0和1)

要使第二个示例与第一个示例等效,您应该直接传递
allrows
,而不是使用
enumerate()

如果需要保留原始索引,
enumerate()
是一种方法。但是,您还需要在键函数中增加一个间接级别:

it = heapq.nlargest(20, enumerate(allrows), key=lambda x:x[1][2]) 
                        ^^^^^^^^^                         ^^^

感谢NPE指出了这个问题,作为替代答案,您可以将所有行与
itertools.chain()
连接起来,并通过排序获得前20个元素,它们的性能比
heapq
更高:

from itertools import chain

sorted(chain(*allrows))[-20:]
如果您试图 找到数量相对较少的项目。如果你只是想找到一个最小的 或者最大的项目
(N=1)
,使用
min()
max()
会更快。类似地,如果N是关于 与集合本身大小相同,通常先对其进行排序并取一个切片(即。,
使用
sorted(items)[:N]
sorted(items)[-N:][/code>)。

行的长度是多少?那些是一样的吗?是的,它们是4号的。所有的,我现在明白了。枚举数返回一个元组。sox[1][2]。我也需要索引,所以我使用enumerate。如果能看到一些基准来支持性能声明(这些东西通常都充满了惊喜),那就太好了。@kasra OP不是在问如何获得前20个元素的解决方案,他是在问他所得到的错误。@Vishnuupadhay是的,尽管这不是我的qsn。直到现在我才知道这件事。所以,谢谢你,卡萨拉。@NPE是的,这是可能的,但我要说的是,以前的基准测试是什么!
NLAGEST()
nsmallest()
的实现在其运行方式上是自适应的,并将代表您执行其中一些优化。@VishnuUpadhyay当NPE正确描述问题时,我必须说什么?;)
from itertools import chain

sorted(chain(*allrows))[-20:]