基于另一个列表中唯一值的索引从一个列表中获取相应的值-Perl

基于另一个列表中唯一值的索引从一个列表中获取相应的值-Perl,perl,Perl,我希望使用perl根据第一个列表中唯一值的索引值从第二个列表中获取相应的值 例如: @list1=('a','b','c','a','d'); @list2=('e','f','g','a','i'); 我想创建两个没有重复值的新列表 @new_list1=('a','b','c','d'); @new_list2=('e','f','g','i'); 我该怎么做 要从一个列表中获取唯一值,我可以使用: my %temp_hash = map { $_, 0 } @list1; my @un

我希望使用perl根据第一个列表中唯一值的索引值从第二个列表中获取相应的值

例如:

@list1=('a','b','c','a','d');
@list2=('e','f','g','a','i');
我想创建两个没有重复值的新列表

@new_list1=('a','b','c','d');
@new_list2=('e','f','g','i');
我该怎么做

要从一个列表中获取唯一值,我可以使用:

my %temp_hash = map { $_, 0 } @list1;
my @uniq_array = keys %temp_hash;   
print "@uniq_array\n";
但是如何从另一个列表中获取相应索引处的值

提前谢谢

编辑: 它应该根据某些条件(而不是第一次出现)找到唯一的值。 例如:

应给出相同的值:

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

在给定的示例中,条件可能是不包括两个列表的值相同的公共元素。也就是说,有两个“a”出现,第一个“a”对应于“e”,第二个“a”对应于“a”。因此,要删除第二个而不是第一个。

在处理并行数组时,需要处理索引。要查找索引列表,可以从以下查找唯一值的方法开始:

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];
}

在处理并行数组时,需要处理索引。要查找索引列表,可以从以下查找唯一值的方法开始:

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];
}
输出:

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

$VAR1 = [
          'e',
          'f',
          'g',
          'i'
        ];
输出:

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

$VAR1 = [
          'e',
          'f',
          'g',
          'i'
        ];

如何检查条件..?已更新以匹配更新的问题。您暗示将有多个选择算法,所以我之前没有对其进行编码,但我只是进一步更新了答案以实现示例选择算法。如何检查条件..?更新以匹配更新的问题。你暗示会有不止一种选择算法,所以我之前没有对其进行编码,但我只是进一步更新了答案以实现示例选择算法。