在Perl中查找二维数组的Index值

时间:2016-01-13 15:38:24

标签: perl perl-data-structures

二维数组中有一些数字@quality_list。 我想提取最大数字的索引号index_max

my $max = max( @{$quality_list[0]} );
my $index_max = qw($max)

3 个答案:

答案 0 :(得分:1)

对于此类的受害问题,您可能希望使用max_by中的List::UtilsBy

use List::UtilsBy qw( max_by );

my @values = @{ $quality_list[0] };
my $maximal_index = max_by { $values[$_] } 0 .. $#values;

这将返回输入列表中的值(列表0 .. $#values;即数组索引列表),它提供max_by控制块的最大结果(即,@values中具有最大值{1}}数组)。

答案 1 :(得分:0)

最多一行(正如您所做的那样):

my $row = $quality_list[0];
my $max = max(@$row);
my @max_indexes = grep { $row->[$_] == $max } 0..$#$row;

对于整个2d数组的最大值(如您所要求的那样):

my $max = max map { @$_ } @quality_list;
my @max_indexes;
for my $y (0..$#quality_list) {
   my $row = $quality_list[$y];
   push @max_indexes,
      map { [ $y, $_ ] }
         grep { $row->[$_] == $max } 0..$#$row;
}

答案 2 :(得分:0)

如果您知道您的最大值只会出现一次(使用List :: Util的ikegami解决方案的一般情况),您可以在一次通过中获得索引和最大值,从而减少迭代次数: / p>

my $idx = 0;
my @max = (-1, undef);
map { @max = $_ > $max[0] ? ($_, $idx++) : @max }
    map { @$_ } @quality_list;

print "max value $max[0] at index [" .
      int($max[1]/scalar(@{$quality_list[0]})) .  "," .
      $max[1] % scalar(@{$quality_list[0]}) . "]\n";

编辑:从前置增加到后置增量以逐个修复。

此外,这是一个避免数组复制并使用所有负值和正值的版本。值得一提的是,与我上面所说的相比,你的最大值可以出现不止一次,虽然从技术上来说只会报告它的第一个实例。

my $idx = 0;
my @max = $quality_list[0][0];
map { @max = ($_, ++$idx) if $_ > $max[0] }
    map { @$_ } @quality_list;

print "max value $max[0] at index [" .
      int($max[1]/scalar(@{$quality_list[0]})) .  "," .
      $max[1] % scalar(@{$quality_list[0]}) . "]\n";