-2

複数行の配列があり、たとえば、1行あたりの整数の数が異なる次の整数が含まれている場合:

1 1 1 2 1 1
2 1 4 1
2 1 1 3 1 6

カウントのないキーの場合、perlのカウントの配列にゼロを変換するにはどうすればよいですか?マップを使用して単一配列の場合にそれを行うことができますが、この複数行の場合/配列の場合の配列に苦労しています。

#For line 1, 1 => 5, 2 => 1
#For line 2, 1 => 2, 2 => 1, 4 => 1
#For line 3, 1 => 3, 2 => 1, 3 => 1, 6 => 1

したがって、結果は次のようになります。

5 1 0 0 0 0
2 1 0 1 0 0
3 1 1 0 0 1

ありがとう!

4

4 に答える 4

3

これは必要なことをしているようです。これは、カウントのハッシュの配列を構築するという明白なことを行い、次に、ディスプレイを構築するためのハッシュのキーの中から最大値を見つけます。

use strict;
use warnings;

use feature 'say';

my @data;

while (<DATA>) {
  next unless /\S/;
  my %counts;
  $counts{$_}++ for split;
  push @data, \%counts;
}

my $max = 0;
for (map keys %$_, @data) {
  $max = $_ unless $max >= $_;
}

for my $row (@data) {
  say join ' ', map $row->{$_} // 0, 1 .. $max;
}

__DATA__

1 1 1 2 1 1
2 1 4 1
2 1 1 3 1 6

出力

5 1 0 0 0 0
2 1 0 1 0 0
3 1 1 0 0 1
于 2012-09-04T13:22:57.860 に答える
1

ETA:負の行列値のサポートを修正しました。ゼロ値が必要なため、浮動小数点数が発生しないと仮定します。

多次元配列を使用する秘訣は、配列にはスカラー値しか含めることができないことを覚えておくことです。この場合、各スカラー値は配列への参照です。

行列に正の整数以外の値を含めることができる場合は、データストレージとしてハッシュを使用する必要があります。

以下の印刷では、初期化されていない(ゼロ)カウントを区別するために、 defined-or演算子を使用しています。

use strict;
use warnings;
use Data::Dumper;
use List::Util qw(max min);

my @a = (
    [qw(1 1 1 2 1 1)],
    [qw(2 1 4 1)],
    [qw(2 1 1 3 1 6)],
);

my @res;
my ($max, $min);

for my $aref (@a) {      # each array element is an array ref
    my %count;
    for (@$aref) {       # the array elements of each ref
        $count{$_}++;    # count the numbers
    }
    $max = max(@$aref, $max // ());
    $min = min(@$aref, $min // ());
    push @res, \%count;
}
for my $href (@res) {
    print join " ", map $href->{$_} // 0, $min .. $max;
    print "\n";
}
print Dumper \@res;

出力:

5 1 0 0 0 0
2 1 0 1 0 0
3 1 1 0 0 1
$VAR1 = [
          {
            '1' => 5,
            '2' => 1
          },
          {
            '4' => 1,
            '1' => 2,
            '2' => 1
          },
          {
            '6' => 1,
            '1' => 3,
            '3' => 1,
            '2' => 1
          }
        ];

欠落しているゼロ値に注意してください。mapこれらは、printステートメントと同様のステートメントで追加できます。

于 2012-09-04T13:39:37.560 に答える
0

どうですか:

use strict;
use warnings;
use Data::Dump qw(dump);

while (<DATA>) {
    chomp;
    my @count = (0) x 7;
    $count[$_]++ for split;
    shift @count;
    dump @count;
}
__DATA__
1 1 1 2 1 1
2 1 4 1
2 1 1 3 1 6

出力:

(5, 1, 0, 0, 0, 0)
(2, 1, 0, 1, 0, 0)
(3, 1, 1, 0, 0, 1)
于 2012-09-04T13:20:55.377 に答える
-1
use warnings;
use strict;
use Data::Dumper;
my @a = ([1, 1, 1, 2, 1, 1], [2, 1, 4, 1], [2, 1, 1, 3, 1, 6]);
my @output = map { 
  my @in = (0, 0, 0, 0, 0, 0);
  $in[$_-1]++ for @$_;
  \@in;
} @a;
print Dumper(\@output), "\n";
于 2012-09-04T13:16:11.533 に答える