3

ソートされた連続しない値を含む配列を perl で取得しました。例: 1 2 3 5 7 11 13 15.

と の外側にあるすべての値を削除し、lowerupperを保持lowerupperて、返された選択に含めたいと思います。それを行う私の方法は次のようになります (おそらく を使用して改善される可能性がありますslice):

my @culledArray;
for ( my $i = 0; $i < scalar(@array); $i++ ) { 
    if ( ( $array[$i] <= $_[1] ) and ( $array[$i] >= $_[0] ) ) { 
       push(@culledArray, $array[$i]);
    }
}

ここで、lowerとはそれぞれとupperに含まれています。これを行うperlビルトインはありますか? $_[0]$_[1]

4

3 に答える 3

4

それを行う組み込みのものは何も知りませんが(これは非常に特定の要件です)、次を使用して入力を節約できますgrep

my @culledArray = grep {( $_ <= $_[1] ) and ( $_ >= $_[0] )} @array;

リストが長く、コピーしたくない場合は、開始インデックスと終了インデックスを見つけてスライスを使用すると便利な場合があります。

于 2012-05-27T19:48:33.027 に答える
1

これは厄介ですが、私のユニットテストは合格しているので、うまくいくようです。@arrayソートされたリストであるという事実に基づいて、下位インデックスと上位インデックスを取得し、 from :$_[0] >= $_[1]を作成します。@culledArray@array[$lower..$upper]

my @culledArray;
my $index = 0;
++$index until $array[$index] >= $_[0];
my $lowerIndex = $index;
while (($array[$index] <= $_[1]) and ($index < $#array)) { ++$index; }
my $upperIndex = $index;

@culledArray = @array[$lowerIndex .. $upperIndex];
return \@culledArray;

これとマットの答えの効率を知りたいです。私は必ずしも全体をトラバースするわけではないことをほぼ確信しています@array(インデックスからトラバースするの0は、見つけるまで$upperIndexです。grepリンクされた回答のメソッドがどのように機能するか、または上記のtoperlのスライスをどのように実装するかはわかりませんただし、コード。@array@culledArray

于 2012-05-27T22:07:38.730 に答える
0

パーセンタイルまたはクォンタイルを使用しているように見えますか? もしそうなら、Statistics::Descriptive役立つかもしれません。

メソッドはそのpercentileパーセンタイルの値とインデックスを返すため、以下のコードを使用できます

use strict;
use warnings;

use Statistics::Descriptive;

my @data = qw/ 1 2 3 5 7 11 13 15 /;

my $stat = Statistics::Descriptive::Full->new;
$stat->add_data(@data);
my ($d25, $i25) = $stat->percentile(25);
my ($d75, $i75) = $stat->percentile(75);

my @subset = ($stat->get_data)[$i25 .. $i75];

print "@subset\n";

出力

2 3 5 7 11
于 2012-05-28T13:48:27.173 に答える