【发布时间】:2022-04-21 11:12:00
【问题描述】:
我有一个值 33、32、8、100 的数组。
如何在这个数组中找到最大值和最小值?
我需要包含任何特殊库吗?
【问题讨论】:
标签: perl
我有一个值 33、32、8、100 的数组。
如何在这个数组中找到最大值和最小值?
我需要包含任何特殊库吗?
【问题讨论】:
标签: perl
List::Util 的min 和max 都可以,
use List::Util qw( min max );
my $min = min @numbers;
my $max = max @numbers;
但List::MoreUtils 的minmax 在同时需要最小值和最大值时效率更高(因为它进行的比较更少)。
use List::MoreUtils qw( minmax );
my ($min, $max) = minmax @numbers;
List::Util 是核心的一部分,但 List::MoreUtils 不是。
【讨论】:
没有模块:
#!/usr/bin/perl
use strict;
use warnings;
my @array = sort { $a <=> $b } qw(33 32 8 100);
print "min: $array[0]\n";
print "max: $array[-1]\n";
【讨论】:
sort 是每个 perl 的内部函数,不需要个模块。检查perldoc -f sort 或man perlfunc。
ERRORS from evaluating PG file: 'sort' trapped by operation mask at line 20 of (eval 2211) 在 Webwork 中,任何(在其上下文中)无效的 Perl 都会被捕获
您可以使用List::Util 轻松完成此操作,例如。
use List::Util qw(min max);
my @arr = (33, 32, 8, 100);
print min(@arr)," ", max(@arr), "\n";
【讨论】:
提供的解决方案很好,但如果你想自己实现它非常简单:
use strict;
use warnings;
my @array = (33, 32, 8, 100);
my ($min, $max);
for (@array) {
$min = $_ if !$min || $_ < $min;
$max = $_ if !$max || $_ > $max
};
print "min: $min\n";
print "max: $max\n";
【讨论】:
!defined($min) 代替!$min 来测试$min 是否未定义(当然$max 也是如此)。
对于数字:
my ($min,$max) = (sort {$a <=> $b} @array)[0,-1];
对于字符串:
my ($min,$max) = (sort {$a cmp $b} @array)[0,-1];
【讨论】:
您可以使用 map 来执行此操作而无需库:
my @array = (33, 32, 8, 100);
my ($max,$min)=(-1e99,1e99); # Initialize to values outside anything in your list
map {$max=$_ if ($_>$max); $min=$_ if($_<$min);} @array;
print "max=$max, min=$min\n";
【讨论】:
for更清晰。
您应该使用自 v5.7.3 以来随 Perl 发行版一起发布的 List::Util,因此可能不需要安装。
use strict;
use warnings;
use feature 'say';
use List::Util qw/ max min /;
my @data = (33, 32, 8, 100);
say min @data;
say max @data;
输出
8
100
【讨论】:
当然,如果你同时想要一个列表的最大值和最小值,那么同时获取两者更有效;它只需要对每 2 项数据执行 3 次顺序比较,而不是 4 次。如果数据集足够大,这可能很重要。
List::Util 不提供 minmax 函数,但 List::MoreUtils 提供。
use strict;
use warnings;
use feature qw( say );
use List::MoreUtils qw( minmax );
my ( $min, $max ) = minmax @data;
say $min;
say $max;
【讨论】:
List::MoreUtils的答案。很抱歉被骗了。
我认为List::Util 是您正在寻找的。p>
【讨论】:
您可以使用Statistics::Lite 计算最小值、最大值等
【讨论】:
使用List::Util module,无论如何建议熟悉它,就像List::MoreUtils:
D:\ :: perl -MList::Util=max -lwe "print max 324, 43, 53, 3532, 43"
3532
D:\ :: perl -MList::Util=min -lwe "print min 324, 43, 53, 3532, 43"
43
【讨论】:
List::Util 具有“max”和“min”函数,您可以使用它们直接找到给定数字列表的最大值和最小值。检查你是否可以使用它。您也可以对数组进行排序,然后确定最高和最低的数字
【讨论】:
这已经很晚了,但这是我在没有任何模块的情况下做到的。
sub min {
my $min = shift;
foreach (@_) {
$min = $_ if $_ < $min;
}
return $min;
}
sub max {
my $max = shift;
foreach (@_) {
$max = $_ if $_ > $max;
}
return $max;
}
【讨论】: