330

私は基本的に組み合わせのpythonバージョンを探していますList<List<int>>

リストのリストが与えられた場合、リスト間の項目のすべての可能な組み合わせを提供する新しいリストが必要です。

[[1,2,3],[4,5,6],[7,8,9,10]] -> [[1,4,7],[1,4,8],...,[3,6,10]]

リストの数は不明なので、すべての場合に機能するものが必要です。エレガンスにボーナスポイント!

4

9 に答える 9

562

あなたが必要itertools.product:

>>> import itertools
>>> a = [[1,2,3],[4,5,6],[7,8,9,10]]
>>> list(itertools.product(*a))
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 4, 10), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 5, 10), (1, 6, 7), (1, 6, 8), (1, 6, 9), (1, 6, 10), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 4, 10), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 5, 10), (2, 6, 7), (2, 6, 8), (2, 6, 9), (2, 6, 10), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 4, 10), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 5, 10), (3, 6, 7), (3, 6, 8), (3, 6, 9), (3, 6, 10)]
于 2009-04-28T16:54:56.923 に答える
28

最も洗練された解決策は、python 2.6 でitertools.productを使用することです。

Python 2.6 を使用していない場合、ドキュメントはitertools.product実際に「手動」の方法で製品を実行するための同等の機能を示しています。

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)
于 2009-04-28T16:55:04.690 に答える
21
listOLists = [[1,2,3],[4,5,6],[7,8,9,10]]
for list in itertools.product(*listOLists):
  print list;

私が最初に出会ったときと同じくらいエレガントだと思っていただければ幸いです。

于 2009-04-28T16:58:13.793 に答える
6

ナンピーはそれを行うことができます:

 >>> import numpy
 >>> a = [[1,2,3],[4,5,6],[7,8,9,10]]
 >>> [list(x) for x in numpy.array(numpy.meshgrid(*a)).T.reshape(-1,len(a))]
[[ 1, 4, 7], [1, 5, 7], [1, 6, 7], ....]
于 2017-01-07T23:36:43.463 に答える