【问题标题】:perl - all possible combinations of hashperl - 所有可能的哈希组合
【发布时间】:2010-12-28 21:07:37
【问题描述】:

告诉我如何获得所有可能的哈希组合

这是一个例子

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

谢谢

【问题讨论】:

  • 您说您希望获得所有可能的组合,但是即使排除了包含相同成员的多重组合的排列,您的示例也没有列出所有可能的组合 - 例如,没有涉及 a2 的多重组合。究竟是什么标准来决定您想要哪种组合以及您不想要哪种组合?
  • 这不是组合。那是排列,但只有可能的混乱的一个子集。用文字解释结果集遵循的原则,或者算法。 - 编辑:↑ 是的,canavanin 说了什么。 ↑

标签: perl hash combinations


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的模块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 ' ' =&gt; sort grep defined, @_} 然后完成工作,计算数组的笛卡尔积,同时减去未定义的元素,并按照您的示例对值进行排序。
    • sort {length $a &lt;=&gt; length $b or $a cmp $b} @$product 然后按指定的顺序打印出产品。

    【讨论】:

    • values %data 将以不确定的顺序返回值;我怀疑@data{ qw/a b c/ } 会更好。
    • @ysth => 我之前有@data{sort keys %data},但我认为这是一个多余的步骤,因为数据稍后会被排序。
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2017-10-04
    • 2020-07-19
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2010-09-25
    相关资源
    最近更新 更多