0

perl を使用して、最初のリストの一意の値のインデックス値に基づいて、2 番目のリストから対応する値を取得したいと考えています。

例:

@list1=('a','b','c','a','d');
@list2=('e','f','g','a','i');

値が重複しない新しいリストを 2 つ作成したい

@new_list1=('a','b','c','d');
@new_list2=('e','f','g','i');

これどうやってするの?

私が使用できる1つのリストから一意の値を取得するには:

my %temp_hash = map { $_, 0 } @list1;
my @uniq_array = keys %temp_hash;   
print "@uniq_array\n";

しかし、他のリストから対応するインデックスの値を取得する方法。

前もって感謝します。

編集:最初の出現ではなく、いくつかの条件に基づいて一意の値を見つける必要があります。例:

@list1=('a','b','c','a','d');
@list2=('e','f','g','a','i');

@list1=('a','b','c','a','d');
@list2=('a','f','g','e','i');

同じ値を与える必要があります:

@new_list1=('a','b','c','d');
@new_list2=('e','f','g','i');

与えられた例では、条件は、両方のリストの値が同じである共通の要素を含めないことです。つまり、'a' が 2 回出現します。1 番目の 'a' は 'e' に対応し、2 番目の 'a' は 'a' に対応します。したがって、最初のものではなく2番目のものを削除する必要があります。

4

2 に答える 2

3

並列配列を扱う場合、インデックスを扱います。インデックスのリストを見つけるには、一意の値を見つける次の一般的な方法から始めることができます。

my %seen;
my @uniq = grep !$seen{$_}++, @dups;

それを展開して、インデックスのリストを入力として受け取ります。

my %seen;
my @indexes = grep !$seen{ $list1[$_] }++, 0..$#list1;

更新された質問では、より複雑なものが必要です。

my %options;
for (0..$#list1) {
   push @{ $options{ $list1[$_] } }, $_;
}

my %seen;
my @indexes;
for (0..$#list1) {
   next if $seen{$_}++;
   my @options = @{ $options{ $list1[$_] } };
   my $option = pick(\@list1, \@list2, \@options) // $options[0];
   push @indexes, $option;
}

次に、必要な要素を抽出するだけです。

my @new_list1 = @list1[ @indexes ];
my @new_list2 = @list2[ @indexes ];

pick説明する可能な選択アルゴリズムの関数は次のとおりです。

sub pick {
   my ($list1, $list2, $options) = @_;
   return ( grep $list1->[$_] ne $list2->[$_], @options )[0];
}
于 2012-08-23T14:02:59.803 に答える
0
use strict;
use warnings;
use Data::Dumper;

my @list1=('a','b','c','a','d');
my @list2=('e','f','g','a','i');

my %hash1 = ();
my %hash2 = ();

$hash1{$_}++ for @list1;

my @uniq_list1 = sort keys %hash1;

for (@list2)
{
    next if defined ($hash1{$_});
    $hash2{$_}++;
}
my @uniq_list2 = sort keys %hash2;

print Dumper(\@uniq_list1);
print Dumper(\@uniq_list2);

出力:

$VAR1 = [
          'a',
          'b',
          'c',
          'd'
        ];

$VAR1 = [
          'e',
          'f',
          'g',
          'i'
        ];
于 2012-08-23T14:17:15.137 に答える