反转哈希

时间:2011-11-01 14:52:31

标签: perl hash

我想知道将散列转换为另一个散列的最有效方法是:

{
D1 -> [ A
        B
        C
      ]
D2 ->  [ A
         B
       ]
D3 -> [ C
        A
      ]
}

我想像这样制作另一个哈希

{
A - > [ D1
        D2
        D3
      ]

B ->  [ D1
        D2
      ]
C -> [ D1
       D3
     ]
}

我尝试的是 第一:在哈希键中找到唯一的术语,(1 for loop) 第二:制作一个所有这些独特术语都是关键的哈希值 第三步:遍历每个唯一键和每个键,如果它存在,将其添加到(2 for loops) 总而言之,3个循环我不相信是最有效的方式

2 个答案:

答案 0 :(得分:4)

这是一种方法:

use strict;
use warnings;

use Data::Dumper;

my %a = ( d1 => ['a','b','c'],
          d2 => ['a','b'],
          d3 => ['c','a'] );

my %b;

for my $k (sort keys %a) {
    push @{$b{$_}}, $k for @{$a{$k}};
}

print Dumper(\%b);

答案 1 :(得分:2)

这是一张非常难以理解的双重地图:

map {
  my $k = $_;
  map { push( @{ $b{$_} }, $k ) } @{ $a{$_} }
} sort( keys(%a) );

或者与@Mat的回复大致相同。