3

不定の長さの不定数のリストを取得し、各リストから1つの要素の可能な組み合わせをそれぞれ生成したいと考えています。効率のために、私の目的では、結果を保存するのではなく、各組み合わせを単純に反復することは許容されます。

たとえば、次のリストのリスト:

[['A','B','C'],['w','x','y','z'],[1,2]]

次のようになります。

['A','w',1],['A','w',2],['A','x',1],['A','x',2],...,['C','z',1],['C','z',2]

zip ではなく、 itertools.permutation() ではありません...リストの数を前もって知っていれば、これを行うのは簡単ですが、この状況ではそうしません。これに対する再帰的な解決策をまとめることができると確信していますが、おそらくこれはすでに解決されています。洞察はありますか?

4

1 に答える 1

10

itertools.productはあなたにぴったりのツールです

>>> some_list = [['A','B','C'],['w','x','y','z'],[1,2]]
>>> list(itertools.product(*some_list))
[('A', 'w', 1), ('A', 'w', 2), ('A', 'x', 1), ('A', 'x', 2), ('A', 'y', 1), ('A', 'y', 2), ('A', 'z', 1), ('A', 'z', 2), ('B', 'w', 1), ('B', 'w', 2), ('B', 'x', 1), ('B', 'x', 2), ('B', 'y', 1), ('B', 'y', 2), ('B', 'z', 1), ('B', 'z', 2), ('C', 'w', 1), ('C', 'w', 2), ('C', 'x', 1), ('C', 'x', 2), ('C', 'y', 1), ('C', 'y', 2), ('C', 'z', 1), ('C', 'z', 2)]

いくつかの重要なポイント

  1. itertools.productパラメータとしてイテラブルを想定しています。splatしたがって、演算子を使用してリストを引数として渡す必要があります
  2. itertools.product はジェネレーターを返します。コンテンツ全体をダンプするには、リストに変換する必要があります。または、それを反復するか、反復可能な関数を期待して関数に渡すことができます

    for e in itertools.product(*some_list):
        print e
    
于 2013-02-13T16:20:50.733 に答える