2

リストのリストを反復処理し、リストからすべての組み合わせを取得したいと考えています。

私は次の方法でそれを行うことができます:

list = [['1','2','3'],['a','b','c'],['x','y','z']]
for itemi in list[0]:
    print itemi
    for itemj in list[1]:
        print itemi+itemj
        for itemk in list[2]:
            print itemi+itemj+itemk

私の問題は、リスト o' リスト内のさまざまな数のリストに対して実行したいということです。最初は 1 つのリストしかなく、(今のところ) 64 個のリストで終了します。

上記の例は 3 つのリストの場合で、実際にはすべてのリストに同じ値 (0 から 255) が含まれています。上記の例を使用したのは、出力がどのように見えるかを確認できるようにするためです。

リストのリストのサイズごとにネストされた for ループを構築する必要なく、これにはもっと良い方法があるに違いないと思いました。

4

1 に答える 1

11

使用itertools.product():

>>> l = [['1','2','3'],['a','b','c'],['x','y','z']]
>>> import itertools
>>> list(itertools.product(*l))
[('1', 'a', 'x'), ('1', 'a', 'y'), ('1', 'a', 'z'), ('1', 'b', 'x'), 
 ('1', 'b', 'y'), ('1', 'b', 'z'), ('1', 'c', 'x'), ('1', 'c', 'y'), 
 ('1', 'c', 'z'), ('2', 'a', 'x'), ('2', 'a', 'y'), ('2', 'a', 'z'), 
 ('2', 'b', 'x'), ('2', 'b', 'y'), ('2', 'b', 'z'), ('2', 'c', 'x'), 
 ('2', 'c', 'y'), ('2', 'c', 'z'), ('3', 'a', 'x'), ('3', 'a', 'y'), 
 ('3', 'a', 'z'), ('3', 'b', 'x'), ('3', 'b', 'y'), ('3', 'b', 'z'), 
 ('3', 'c', 'x'), ('3', 'c', 'y'), ('3', 'c', 'z')]

これはまだあなたが望むものではありませんが、そこにたどり着くのは簡単です:

>>> for i in range(len(l)):
...     print(list(itertools.product(*l[:i+1])))
...
[('1',), ('2',), ('3',)]
[('1', 'a'), ('1', 'b'), ('1', 'c'), ('2', 'a'), ('2', 'b'), ('2', 'c'), 
 ('3', 'a'), ('3', 'b'), ('3', 'c')]
[('1', 'a', 'x'), ('1', 'a', 'y'), ('1', 'a', 'z'), ('1', 'b', 'x'), 
 ('1', 'b', 'y'), ('1', 'b', 'z'), ('1', 'c', 'x'), ('1', 'c', 'y'), 
 ('1', 'c', 'z'), ('2', 'a', 'x'), ('2', 'a', 'y'), ('2', 'a', 'z'), 
 ('2', 'b', 'x'), ('2', 'b', 'y'), ('2', 'b', 'z'), ('2', 'c', 'x'), 
 ('2', 'c', 'y'), ('2', 'c', 'z'), ('3', 'a', 'x'), ('3', 'a', 'y'), 
 ('3', 'a', 'z'), ('3', 'b', 'x'), ('3', 'b', 'y'), ('3', 'b', 'z'), 
 ('3', 'c', 'x'), ('3', 'c', 'y'), ('3', 'c', 'z')]

1 つのリストですべてを取得します。

>>> result = []
>>> for i in range(len(l)):
...     result.extend(list(itertools.product(*l[:i+1])))
...
>>> result
[('1',), ('2',), ('3',), ('1', 'a'), ('1', 'b'), ('1', 'c'), ('2', 'a'), 
 ('2', 'b'), ('2', 'c'), ('3', 'a'), ('3', 'b'), ('3', 'c'), ('1', 'a', 'x'), 
 ('1', 'a', 'y'), ('1', 'a', 'z'), ('1', 'b', 'x'), ('1', 'b', 'y'), 
 ('1', 'b', 'z'), ('1', 'c', 'x'), ('1', 'c', 'y'), ('1', 'c', 'z'), 
 ('2', 'a', 'x'), ('2', 'a', 'y'), ('2', 'a', 'z'), ('2', 'b', 'x'), 
 ('2', 'b', 'y'), ('2', 'b', 'z'), ('2', 'c', 'x'), ('2', 'c', 'y'), 
 ('2', 'c', 'z'), ('3', 'a', 'x'), ('3', 'a', 'y'), ('3', 'a', 'z'), 
 ('3', 'b', 'x'), ('3', 'b', 'y'), ('3', 'b', 'z'), ('3', 'c', 'x'), 
 ('3', 'c', 'y'), ('3', 'c', 'z')]

あなたが望む正確な形でそれを手に入れてください:

>>> sorted(result)
[('1',), ('1', 'a'), ('1', 'a', 'x'), ('1', 'a', 'y'), ('1', 'a', 'z'), 
 ('1', 'b'), ('1', 'b', 'x'), ('1', 'b', 'y'), ('1', 'b', 'z'), ('1', 'c'), 
 ('1', 'c', 'x'), ('1', 'c', 'y'), ('1', 'c', 'z'), ('2',), ('2', 'a'), 
 ('2', 'a', 'x'), ('2', 'a', 'y'), ('2', 'a', 'z'), ('2', 'b'), ('2', 'b', 'x'), 
 ('2', 'b', 'y'), ('2', 'b', 'z'), ('2', 'c'), ('2', 'c', 'x'), ('2', 'c', 'y'), 
 ('2', 'c', 'z'), ('3',), ('3', 'a'), ('3', 'a', 'x'), ('3', 'a', 'y'), 
 ('3', 'a', 'z'), ('3', 'b'), ('3', 'b', 'x'), ('3', 'b', 'y'), ('3', 'b', 'z'), 
 ('3', 'c'), ('3', 'c', 'x'), ('3', 'c', 'y'), ('3', 'c', 'z')]
于 2012-10-16T11:06:54.313 に答える