2012-12-07 3 views
-4

가능한 중복 : 나는 꽤 솔루션을 웹을 탐색했다,하지만 난 내 요구를 충족 아무것도 찾을 수 없습니다
Perl sorting hash by values in the hash정렬 해시 값

.

나는 각 단어에 부착 된 값 단어의 큰 목록을

예 :

my %list = (
    word => 10, 
    xword => 15, 
    yword => 1 
) 

목록은 끝이 있지만 상위 5 해시 요소를 반환 할 수 있도록하려면 가장 높은 대응하는 값

답변

2
use strict; 
use warnings; 

sub topN { 
    my ($N, %list) = (shift, @_); 
    $N = keys %list if $N > keys %list; 
    return (sort { $list{$b} <=> $list{$a} } keys %list)[0..$N-1]; 
} 

my %list = (word => 10, xword => 15, yword => 1, zword => 4);  
print join (",", topN(5, %list)), "\n"; 

출력 :

xword,word,zword,yword 
+0

음이 과도하지? – Borodin

+0

어떤 의미입니까? 너의 것은 같다 : – perreal

+0

splice는리스트를 복사하지만'[0..4]'는 그렇지 않다? – perreal

1

이것은 필요한 작업을 수행합니다. 해시의 요소 수가 5 개 미만이고이를 처리하기 위해 코드를 추가해야하는 경우 경고가 Use of uninitialized value 번 발생합니다. 상위 5 개 값만 찾는 것이 아니라 전체 해시를 정렬한다는 점에서 비효율적입니다. 그것이 문제인지 아닌지 여부는 상황에 따라 다릅니다.

use strict; 
use warnings; 

my %list = (
    word => 10, 
    xword => 15, 
    yword => 1, 
); 

my @top5 = (sort { $list{$b} <=> $list{$a} } keys %list)[0..4]; 

print "$_\n" for @top5; 

출력

xword 
word 
yword 
+0

+1 동일하게 올랐지 만'[0..4]'슬라이스가 메모리를 낭비하는 것에 대해 걱정했습니다. 잘못 되었습니까? 아니면이 경우에도 중요합니까? – Kenosis

+0

@Kenosis : 그것은'% list'의 크기에 달려 있습니다. 데이터가 * 거대한 경우 * 메모리가 문제 일 수 있지만 전체를 정렬하는 대신 상위 N 개 항목에 대한 선택 정렬을 수행해야합니다. – Borodin

+0

알았어요. 고맙습니다 ... – Kenosis

0
use strict; 
use warnings; 

my %list = (
    word => 10, 
    xword => 15, 
    yword => 1, 
); 

my @top5 = sort { $list{$b} <=> $list{$a} } keys %list; 
splice(@top5, 5) if @top5 > 5; 

print "$_\n" for @top5; 
+0

5.16+에서 경고를 추가하지 않고'if @ top5> 5 '를 제거 할 수 있습니다. – ikegami