gpt4 book ai didi

多个范围的 Perl for 循环

转载 作者:行者123 更新时间:2023-12-01 09:56:57 25 4
gpt4 key购买 nike

在 for 循环中设置范围计数器的最佳方法是什么?我有一个 tab-delim 输入文件,其中前两列很重要。我想找到在 Pos 值范围内出现的分数的最小值和最大值。所以对于示例输入文件:

Pos     Score
1 5
2 17
9 80
38 22
40 11
7 0
302 19
85 33
12 51
293 1
5 19
61 8
71 15

我需要计算每个范围的最小和最大分数(如果存在)。

1-29 (min=?, max=?)
30-59 (min=?, max=?)
60-89 (min=?, max=?)

预期结果:

1-29 (min=0, max=80)
30-59 (min=11, max=22)
60-89 (min=8, max=33)
290-219 (min=1, max=19)

还有另一个线程与此相关,但他们只计算设定范围内的出现次数。我的尝试是设置一个 for 循环:

use List::MoreUtils qw( minmax );
my %inputhash;
my %storehash;

open (FF,$inputfile) || die "Cannot open file $inputfile";
while(<FF>) {
next if $. < 2; #use to trim off first line if there is a header
my ($Pos, $Score) = split;
$inputhash{$Pos} = $Score;
}


for (my $x=1; $x<1600; $x+29) #set to 1600 for now
{
my $low = $x;
my $high = $x+29;
foreach my $i ($low...$high)
{
if (exists $inputhash{$i})
{
my $score = $inputhash{$i};
push (@{$storehash{$high}}, $score);
}
}
}

foreach my $range (sort {$a <=> $b} keys %storehash)
{
my ($minrange, $maxrange) = minmax @{$storehash{$range}};
print "$range: $minrange, $maxrange\n";
}

有没有更好的方法来处理这个问题?当前的实现给我一个错误:在 void 上下文中无用地使用加法 (+)。

最佳答案

如果您将数据放入数组而不是散列:

$inputarray[$Pos] = $Score;

您可以在数组切片上使用 minmax(在去除所有未定义的值之后):

my ($min, $max) = minmax grep {defined} @inputarray[0..3];

例如

#!/usr/bin/perl
use strict;
use warnings;

use List::MoreUtils qw(minmax);
use List::Util qw(min);

my @inputarray;
<DATA>;
while (<DATA>) {
my ($pos, $score) = split;
$inputarray[$pos] = $score;
}

for (my $i = 1; $i < @inputarray; $i += 29) {
my $end = min($i + 29, $#inputarray); # Don't overrun the end of the array.
my ($min, $max) = minmax grep {defined} @inputarray[$i..$end];
print "$i-$end (min=$min,max=$max)\n" if defined $min;
}

__DATA__
Pos Score
1 5
2 17
9 80
38 22
40 11
7 0
302 19
85 33
12 51
293 1
5 19
61 8
71 15

输出:

1-30 (min=0,max=80)
30-59 (min=11,max=22)
59-88 (min=8,max=33)
291-302 (min=1,max=19)

关于多个范围的 Perl for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com