2010-12-28 18 views
2

のすべての可能な組み合わせがここでハッシュperlの - ハッシュ

のすべての組み合わせを取得する方法を教えては

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 

感謝を取得する例

​​

ある

+1

同じメンバーを含むマルチプレットの置換を除外しても、すべての可能な組み合わせをリストしていない場合でも、a2を含むマルチプレットはありません。あなたが望む組み合わせと、あなたが望まない組み合わせを決定するための基準はどれくらいですか? – canavanin

+0

それは組み合わせではありません。それは順列ですが、可能性のある誤謬のサブセットだけがあります。結果セットが従うという原則、あるいはおそらくアルゴリズムを説明する。 - 編集:↑うん、カナワンは言った。 ↑ – daxim

答えて

4

私のモジュール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は、指定された順序で製品をプリントアウトします。
+0

はい、これは正しい選択です!ありがとうございました – DenverZ

+0

値%dataは不確定な順序で値を返します。私は '@data {qw/a b c /}'が良いと思う。 – ysth

+0

@ysth =>前に '@data {sort keys%data}'を持っていましたが、データが後でソートされているので冗長なステップだと思いました。 –

4

brian d foyのSet::CrossProductモジュール。ハッシュを配列の配列に明白な方法でマッサージする必要があります。

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

私はちょうど の組み合わせを取得する必要があり、A1、A2 A3 A1、B1 A1 B2 A1 B3 A1 C1 等... – DenverZ

関連する問題