-4

重複の可能性:
ハッシュ内の値による Perl ソート ハッシュ

解決策を求めて Web をかなり閲覧しましたが、自分のニーズを満たすものは見つかりませんでした。

各単語に値が付加された単語の大きなリストがあります

例:

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

リストは延々と続きますが、対応する値が最も高い上位 5 つのハッシュ要素を返すことができるようにしたいと考えています。

4

3 に答える 3

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
于 2012-12-07T23:45:19.280 に答える
1

これは必要なことを行います。Use of uninitialized valueハッシュの要素が 5 つ未満の場合は警告がスローされ、それに対応するためにコードを追加する必要がある場合があることに注意してください。また、上位 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
于 2012-12-07T23:48:57.183 に答える
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;
于 2012-12-08T01:48:23.087 に答える