2014-11-28 2 views
7

목록 목록에서 nlargest 요소를 얻기 위해 heapq를 사용하고 있습니다. 내가 작성한 프로그램은 아래와 같습니다.파이썬 목록에서 n 개의 가장 큰 목록을 얻는 방법

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를 사용하는 속성이 누락되었습니다.

+0

행의 길이는 어떻게 되나요? 그것들은 같은가요? – Kasramvd

+0

예, 크기 4입니다. – WannaBeCoder

답변

2

enumerate()은 2 튜플에 대한 반복 가능을 반환합니다. 따라서 두 번째 예제에서 x[2]에 액세스하는 것은 항상 범위를 벗어납니다 (유일한 유효한 인덱스는 0과 1입니다).

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

원래 인덱스를 보존해야하는 경우, enumerate() 갈 방법은 다음과 같습니다

당신은 enumerate()를 사용하는 대신 직접 allrows을 통과해야한다, 처음에 두 번째 예제와 동등한를 확인하십시오. 그러나, 당신은 또한 핵심 기능에 간접적 인 추가 레벨을 필요

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

지금 받으십시오. Th 열거자는 튜플을 반환합니다. 그래서 x [1] [2]. 인덱스를 사용하여 열거 형을 사용하고 싶었습니다. – WannaBeCoder

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:])를 사용하는 것이 더 빠릅니다.

+0

성능에 대한 주장을 뒷받침하는 벤치 마크를 보는 것이 좋습니다 (이러한 것들은 종종 놀라움으로 가득합니다). – NPE

+0

@kasra OP는 해결책 20 가지 요소를 얻는 방법을 묻지 않고, 그가 얻고있는 오류를 묻습니다. –

+0

@VishnuUpadhyay 예, 이것이 내 qsn이 아니었지만. 나는 지금까지 이것을 알지 못했다. 고마워. – WannaBeCoder

관련 문제