инвертировать хеш - PullRequest
       2

инвертировать хеш

0 голосов
/ 01 ноября 2011

Мне интересно, как наиболее эффективно преобразовать хэш в другой хэш следующим образом:

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

Я хотел бы создать еще один хеш, подобный этому

{
A - > [ D1
        D2
        D3
      ]

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

первое, что я пробовал: найти уникальные термины в ключах хеш-функции, (1 для цикла), второе: создать хэш, в котором все эти уникальные термины являются третьим ключом: пройти через каждый уникальный и каждый ключ, если он существует, добавить его в (2для циклов) в сумме 3 цикла, которые я не считаю наиболее эффективным способом

Ответы [ 2 ]

4 голосов
/ 01 ноября 2011

Вот один из способов сделать это:

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);
2 голосов
/ 01 ноября 2011

Вот вам удивительно нечитаемая двойная карта:

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

В остальном это более или менее совпадает с ответом @ Mat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...