簡體   English   中英

如何從python中的列表列表中獲取n個最大列表

[英]How can I get n largest lists from a list of lists in 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=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

我能知道為什么我會收到錯誤以及如何解決它。 有沒有使用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:] )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM