基于另一个列表中唯一值的索引从一个列表中获取相应的值-Perl
我希望使用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
@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'
];
如何检查条件..?已更新以匹配更新的问题。您暗示将有多个选择算法,所以我之前没有对其进行编码,但我只是进一步更新了答案以实现示例选择算法。如何检查条件..?更新以匹配更新的问题。你暗示会有不止一种选择算法,所以我之前没有对其进行编码,但我只是进一步更新了答案以实现示例选择算法。