二维数组中有一些数字@quality_list
。
我想提取最大数字的索引号index_max
。
my $max = max( @{$quality_list[0]} );
my $index_max = qw($max)
答案 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";