2012-08-23 78 views
0

我想從第二個列表中根據第一個列表中唯一值的索引值使用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 @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」出現,第一個「a」對應於「e」,第二個「a」對應於「a」。所以第二個不是第一個。

回答

3

當處理並行數組時,一個處理索引。要查找的索引列表,可以與找到的唯一值以下common方法啓動:

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

如何檢查的條件..? – heretolearn

+0

已更新,以符合更新後的問題。你暗示將會有不止一種選擇算法,所以我沒有早先對其進行編纂,但我進一步更新了實現示例選擇算法的答案。 – ikegami

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' 
     ]; 
相關問題