perl - 哈希的所有可能组合

时间:2010-12-28 21:07:37

标签: perl hash combinations

告诉我如何获得散列的所有可能组合

以下是

的示例
my %data = (
'a' => [qw(a1 a2 a3)],
'b' => [qw(b1 b2 b3)],
'c' => [qw(c1 c2 c3)]);

获取

a1
a2
a3
b1
b2
b3
c1
c2
c3

a1 b1
a1 b2
a1 b3
a1 c1
a1 c2
a1 c3

b1 c1
b1 c2
b1 c3
b2 c1
b2 c2
b2 c3
b3 c1
b3 c2
b3 c3

a1 b1 c1
a1 b1 c2
a1 b1 c3
a1 b2 c1
a1 b2 c2
a1 b2 c3
a1 b3 c1
a1 b3 c2
a1 b3 c3
a2 b1 c1
a2 b1 c2
a2 b1 c3
a2 b2 c1
a2 b2 c2
a2 b2 c3
a2 b3 c1
a2 b3 c2
a2 b3 c3
a3 b1 c1
a3 b1 c2
a3 b1 c3
a3 b2 c1
a3 b2 c2
a3 b2 c3
a3 b3 c1
a3 b3 c2
a3 b3 c3

感谢

2 个答案:

答案 0 :(得分:6)

使用brian d foy的Set::CrossProduct模块。您需要以明显的方式将哈希按到阵列数组中。

use Set::CrossProduct;
my $iterator = Set::CrossProduct->new( ARRAY_OF_ARRAYS );
my $tuples = $iterator->combinations;

答案 1 :(得分:5)

我的模块List::Gen包含一个cartesian函数,可以生成所需的结果。这段代码似乎可以解决问题,但是你的例子并没有包含这将产生的所有排列,我假设这只是示例中的遗漏。

use List::Gen 'cartesian';

my %data = (
    'a' => [qw(a1 a2 a3)],
    'b' => [qw(b1 b2 b3)],
    'c' => [qw(c1 c2 c3)],
);

my $product = cartesian {join ' ' => sort grep defined, @_}
              map {[@$_, undef]} 
              values %data;

say for sort {length $a <=> length $b or $a cmp $b} @$product;

这有点密集,所以要解释一下:

  • values %data返回%data
  • 中的数组
  • map {[@$_, undef]}然后将空值附加到每个结尾,因为您需要部分组合
  • cartesian {join ' ' => sort grep defined, @_}然后完成工作,计算数组的笛卡尔积,同时减去未定义的元素,并按照示例显示对值进行排序。
  • sort {length $a <=> length $b or $a cmp $b} @$product然后按指定的顺序打印出产品。