重複の可能性:
ハッシュ内の値による Perl ソート ハッシュ
解決策を求めて Web をかなり閲覧しましたが、自分のニーズを満たすものは見つかりませんでした。
各単語に値が付加された単語の大きなリストがあります
例:
my %list = (
word => 10,
xword => 15,
yword => 1
)
リストは延々と続きますが、対応する値が最も高い上位 5 つのハッシュ要素を返すことができるようにしたいと考えています。
重複の可能性:
ハッシュ内の値による Perl ソート ハッシュ
解決策を求めて Web をかなり閲覧しましたが、自分のニーズを満たすものは見つかりませんでした。
各単語に値が付加された単語の大きなリストがあります
例:
my %list = (
word => 10,
xword => 15,
yword => 1
)
リストは延々と続きますが、対応する値が最も高い上位 5 つのハッシュ要素を返すことができるようにしたいと考えています。
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
これは必要なことを行います。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
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;