1

最大値から最小値でソートしたハッシュがあります。ベスト5に入るにはどうすればいいですか?ここに、値を 1 つだけ取得することについて話している投稿がありました。

Perlでハッシュから最高値のキーを取得する最も簡単な方法は何ですか?

これらの値を取得して配列に追加し、ハッシュ内の要素を削除してから、もう一度プロセスを実行するとしますか?

ただし、これを行う簡単な方法があるはずです。

私のハッシュは %words と呼ばれます。

編集済み 質問が実際に必要とせずに答えたときにコードを取り出しました。

4

3 に答える 3

5

あなたの質問は、ハッシュから上位 5 つの値を取得する方法です。あなたはこのコードを持っています:

my @keys = sort {
    $words{$b} <=> $words{$a}
    or
    "\L$a" cmp "\L$b"
} keys %words;

ソートされたハッシュキーがある場所。そこから 5 つのトップ キーを取得しますか?

my @highest = splice @keys, 0, 5;  # also deletes the keys from the array
my @highest = @keys[0..4];         # non-destructive solution

また、コードに関するいくつかのコメント:

open( my $filehandle0, '<', $file0 ) || die "Could not open $file0\n";

エラー メッセージ$!を die ステートメントに含めて、open が失敗した理由に関する貴重な情報を取得することをお勧めします。

for (@words) {
    s/[\,|\.|\!|\?|\:|\;|\"]//g;
}

コメントで述べたように、文字をエスケープしたり、文字クラス ブラケットで代替を使用したりする必要はありません。次のいずれかを使用します。

s/[,.!?:;"]//g for @words;   #or
tr/,.!?:;"//d  for @words;

この次の部分は少し奇妙です。

my @stopwords;
while ( my $line = <$filehandle1> ) {
    chomp $line;
    my @linearray = split( " ", $line );
    push( @stopwords, @linearray );
}
for my $w ( my @stopwords ) {
    s/\b\Q$w\E\B//ig;
}

ファイルからストップワードを読み込んでから、$_?からストップワードを削除します。$_この時点でも使用していますか?さらに、@stopwordsループヘッダーで配列を再宣言しています。これは、新しい配列が空になり、ループが実行されないことを意味します。このエラーはサイレントであるように見えるので、気付かないかもしれません。

my %words = %words_count;

ここで のコピーを作成しますが%words_count、これは二度と使用しないため冗長に見えます。大きなハッシュがある場合、パフォーマンスが低下する可能性があります。

my $key_count = 0;
$key_count = keys %words;

これは 1 行で実行できますmy $key_count = keys %words。私の意見では、より読みやすい。

$value_count = $words{$key} + $value_count;

演算子で短縮することもできます+=:$value_cont += $words{$key}

strict と warnings を使用することは非常に良いことです。

于 2012-12-04T05:40:42.150 に答える
3

パフォーマンスが大した問題ではない場合

(sort {$words{$a} <=> $words{$b}} keys %words)[0..4])

絶対に高速が必要な場合は、5 回の反復後に終了する選択ソートがおそらく最適です。

my @results;
for (0..4) {
  my $maxkey;
  my $max = 0;

  for my $key (keys %words){
    if ($max < $words{$key}){
      $maxkey = $key;
      $max = $words{$key};
     }
  }
  push @results, $maxkey;
  delete $words{$maxkey};
}

say join(","=>@results);
于 2012-12-04T04:22:13.193 に答える
1

そのためのCPANモジュール、Sort :: Key::Topがあります。わかりやすいインターフェースと効率的なXS実装を備えています。

use Sort::Key::Top qw(rnkeytop);

my @results = rnkeytop { $words{$_} } 5 => keys %words;
于 2012-12-04T12:20:43.283 に答える