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

我正在使用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_progsDaDvIMDBAssignment1.py", line 42, in <module>
  it=heapq.nlargest(2,enumerate(allrows),key=lambda x:x[2])
File "C:Python27libheapq.py", line 470, in nlargest
  result = _nlargest(n, it)
File "D:eclipse_progsDaDvIMDBAssignment1.py", line 42, in <lambda>
  it=heapq.nlargest(2,enumerate(allrows),key=lambda x:x[2])
IndexError: tuple index out of range

我可以知道为什么我收到错误以及如何解决它。 有没有使用heapq的任何属性,我缺少。


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

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

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

如果你需要保留原始的索引, 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:]

如果您试图查找相对较少的项目,则nlargest()nsmallest()函数是最合适的。 如果您只是试图找到单个最小或最大的项目(N=1) ,则使用min()max()会更快。 同样,如果N与集合本身的大小大致相同,则首先对它进行排序并采取切片(即,使用sorted(items)[:N]sorted(items)[-N:] )通常会更快。

链接地址: http://www.djcxy.com/p/82779.html

上一篇: How can I get n largest lists from a list of lists in python

下一篇: How to integrate npm/gulp/bower building process into sbt?