我正在使用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
Run Code Online (Sandbox Code Playgroud)
我只想要前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
Run Code Online (Sandbox Code Playgroud)
我能知道为什么我会收到错误以及如何解决它.有没有使用heapq的属性我缺少.
enumerate()返回 2 元组上的可迭代对象。因此,x[2]在第二个示例中进行访问总是超出范围(唯一有效的索引是 0 和 1)。
要使第二个示例与第一个示例等效,您应该allrows直接传递而不是使用enumerate():
it = heapq.nlargest(20, allrows, key=lambda x:x[2])
Run Code Online (Sandbox Code Playgroud)
如果您需要保留原始索引,enumerate()这是可行的方法。但是,您还需要在关键函数中进行额外的间接级别:
it = heapq.nlargest(20, enumerate(allrows), key=lambda x:x[1][2])
^^^^^^^^^ ^^^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |