Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl—所有可能的哈希组合_Perl_Hash_Combinations - Fatal编程技术网

perl—所有可能的哈希组合

perl—所有可能的哈希组合,perl,hash,combinations,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

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

以下是一个示例

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
谢谢使用brian d foy的模块。您将需要以一种明显的方式将哈希值转换为数组数组

use Set::CrossProduct;
my $iterator = Set::CrossProduct->new( ARRAY_OF_ARRAYS );
my $tuples = $iterator->combinations;
使用brian d foy的模块。您将需要以一种明显的方式将哈希值转换为数组数组

use Set::CrossProduct;
my $iterator = Set::CrossProduct->new( ARRAY_OF_ARRAYS );
my $tuples = $iterator->combinations;
我的模块包含一个笛卡尔函数,可以产生你想要的结果。这段代码似乎做到了这一点,但您的示例并不包含这将产生的所有排列,我假设这只是示例中的一个遗漏

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;
使用列表::Gen'cartesian';
我的%data=(
'a'=>[qw(a1 a2 a3)],
‘b’=>[qw(b1 b2 b3)],
‘c’=>[qw(c1-c2-c3)],
);
my$product=cartesian{join'=>sort grep defined,@}
映射{[@$\uuux,未定义]}
值%数据;
比如说排序{length$a length$b或$a cmp$b}@$产品;
这有点复杂,所以要解释一下:

  • values%data
    返回
    %data
  • 映射{[@$\uuz,unde]}
    然后在每个映射的末尾附加一个空值,因为您需要部分组合
  • cartesian{join'=>sort grep defined,@}
    然后执行主要工作,计算数组的笛卡尔乘积,同时减去未定义的元素,并对值进行排序,如示例所示
  • sort{length$a length$b或$a cmp$b}@$product
    然后按指定顺序打印产品
我的模块包含一个笛卡尔函数,可以产生你想要的结果。这段代码似乎做到了这一点,但您的示例并不包含这将产生的所有排列,我假设这只是示例中的一个遗漏

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;
使用列表::Gen'cartesian';
我的%data=(
'a'=>[qw(a1 a2 a3)],
‘b’=>[qw(b1 b2 b3)],
‘c’=>[qw(c1-c2-c3)],
);
my$product=cartesian{join'=>sort grep defined,@}
映射{[@$\uuux,未定义]}
值%数据;
比如说排序{length$a length$b或$a cmp$b}@$产品;
这有点复杂,所以要解释一下:

  • values%data
    返回
    %data
  • 映射{[@$\uuz,unde]}
    然后在每个映射的末尾附加一个空值,因为您需要部分组合
  • cartesian{join'=>sort grep defined,@}
    然后执行主要工作,计算数组的笛卡尔乘积,同时减去未定义的元素,并对值进行排序,如示例所示
  • sort{length$a length$b或$a cmp$b}@$product
    然后按指定顺序打印产品

您说过希望获得所有可能的组合,但即使排除包含相同成员的多重集排列,您的示例也没有列出所有可能的组合-例如,没有涉及a2的多重集。你的标准是什么来决定你想要哪种组合和不想要哪种组合?这不是组合。这是一种排列,但只是可能的混乱的一个子集。用文字解释结果集遵循的原则,或者可能是算法。-编辑:↑ 是的,就像卡纳瓦宁说的。↑你说过你想得到所有可能的组合,但即使排除包含相同成员的多重集的排列,你的例子也没有列出所有可能的组合——例如,没有涉及a2的多重集。你的标准是什么来决定你想要哪种组合和不想要哪种组合?这不是组合。这是一种排列,但只是可能的混乱的一个子集。用文字解释结果集遵循的原则,或者可能是算法。-编辑:↑ 是的,就像卡纳瓦宁说的。↑值%数据将以不确定的顺序返回值;我怀疑
@data{qw/ab c/}
会更好。@ysth=>我以前有
@data{sort keys%data}
,但我认为这是一个多余的步骤,因为数据稍后会被排序。values%data将以不确定的顺序返回值;我怀疑
@data{qw/ab c/}
会更好。@ysth=>我以前有
@data{sort keys%data}
,但我认为这是一个多余的步骤,因为数据稍后会被排序。