【问题标题】:inversing a hash反转哈希
【发布时间】:2011-11-01 14:52:31
【问题描述】:

我想知道将哈希反转为另一个哈希的最有效方法如下:

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

我想再做一个这样的哈希

{
A - > [ D1
        D2
        D3
      ]

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

我尝试过的是 第一:在哈希键中找到唯一的词,(1个for循环) 第二:制作一个哈希,所有这些唯一的术语都是关键 第三:遍历每个唯一键和每个键,如果存在,则将其添加到(2个for循环) 总之,我认为这不是最有效的 3 个循环

【问题讨论】:

标签: perl hash


【解决方案1】:

这是一种方法:

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);

【讨论】:

  • 出于好奇:自动创建数组引用作为 %b 的值是自动生存,不是吗?
  • 垫子,不是所有平台都支持在shebang后面加一个空格。此外,为了清楚起见,您可能需要拼出内部 for 循环。
  • 既然你已经把我叫出来了,我不记得具体情况了。我知道我多年来的风格是空白,大约三年前,我不得不把空白拿出来,因为它在某处破坏了某些东西。我会让它炖一会儿,希望确切的情况会回到我身边。
  • @alakaboo:我确信有一些不知名的平台需要空间。更重要的是:并非每个平台都在 /usr/bin 中提供 Perl 可执行文件。
  • @musiKk:在那里,修复它。使用perl script.pl 运行,确保 perl 在您的路径中。 :)
【解决方案2】:

这是一张非常难以阅读的双地图:

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

其他方面和@Mat 的回复差不多。

【讨论】:

  • @mwp:从 5.8.1 开始,map 具有上下文感知能力,不会(浪费地)生成要在 void 上下文中返回的项目列表。不过,我还是不会这样写。
  • @MichaelCarman,就是这样。这不是解决问题的好方法,因为它或多或少不可读。这就是为什么我提到了 Mat 的回复,这是同一解决方案的更具可读性的版本。
猜你喜欢
  • 2011-05-30
  • 2012-03-20
  • 2015-04-23
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多