【问题标题】:Perl - Identify all elements in a hash that have the highest valuePerl - 识别哈希中具有最高值的所有元素
【发布时间】:2023-03-06 08:33:01
【问题描述】:

我编写了一些 Perl 代码,用于在哈希中搜索最高的键值对,其中键是文本,值是数字:

my $o_val = 0;    # FOR TRACKING HIGHEST VALUE ENCOUNTERED IN THE LOOP
my $o_key;        # FOR TRACKING CORRESPONDING KEY TO THE HIGHEST VALUE
while ( my ($key, $val) = each(%NG) ) {
        if ( $val > $o_val ) {
                $o_val = $val;
                $o_key = $key;
        }
}
print "$okey\n";

问题在于,它无法解释最高价值并列的可能性。 如果我的测量变量可能会随着循环的每次迭代而发生变化,我如何捕获所有与最高值相关的键值对?

我的想法是,在 $o_val 被确定为最高值之后,我可以编写另一个 while 循环来运行相同的哈希,然后将与 $o_val 配对的每个键推入另一个数组,例如:

my @highest;     # ARRAY OF HIGHEST-VALUE KEYS
while ( my ($key, $val) = each(%NG) ) {
    if ( $val == $o_val ) { push(@highest, $key); }
}

但这似乎有点低效。我希望有一些我不知道的 Perl 命令可以让我识别散列中的最高值,而无需遍历它,这样我就可以在我的问题中使用第二段代码。

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    您可以使用数组来保留最高值的键,

    if ( $val > $o_val ) {
      $o_val  = $val;
      @o_keys = $key;
    }
    elsif ($val == $o_val) {
      push(@o_keys, $key);
    }
    

    【讨论】:

      【解决方案2】:
      #!/usr/bin/env perl
      
      use strict;
      use warnings;
      
      my %h = map { $_ => int(rand 10)} 'a' .. 'z';
      
      # see what we've got
      my @k = sort { $h{$b} <=> $h{$a} } keys %h;
      print "$_ => $h{$_}\n" for @k;
      
      # initialize $max with a value from %h
      my ($max) = values %h;
      # keys with highest values
      my @argmax;
      
      while (my ($k, $v) = each %h) {
          next if $v < $max;
          if ($v > $max) {
              $max = $v;
              @argmax = ($k);
          }
          else {
              push @argmax, $k
          }
      }
      
      print "@argmax\n";
      print "@h{ @argmax }\n";
      

      当然,如果你不太关心记忆,或者如果你在打高尔夫球,或者打牙签,你可以这样写:

      my %v;
      push @{ $v{$h{$_}} }, $_ for keys %h;
      my ($max) = sort { $b <=> $a } keys %v;
      print "@{ $v{$max} } => $max\n"
      

      【讨论】:

      • 在阅读您的回答之前,我不知道打高尔夫球或打牙是什么。你为我打开了一个全新的世界供我探索。
      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2019-07-30
      • 2011-08-22
      • 2014-03-15
      • 2011-10-24
      • 2012-09-06
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多