1

長さ n の数値のリストの場合、たとえば、 x がリストの値である場合[1, 3, 1, 2, ...]の値のすべての可能な組み合わせのリストのリストを作成したいと思います。range[x+1]出力は次のようになります。

for list[1, 3, 2] return all possible lists of range[x+1] values:
    # the sequence of the list is unimportant
[
[0,0,0],[1,0,0],[0,1,0],[0,2,0],[0,3,0],[0,0,1],[0,0,2],[1,1,0],
[1,2,0],[1,3,0],[1,0,1],[1,0,2],[0,1,1],[0,2,1],[0,3,1],[0,1,2],
[0,2,2],[0,3,2],[1,1,1],[1,2,1],[1,3,1],[1,1,2],[1,2,2],[1,3,2]
]

[e1, e2, e3]したがって、この例では、 fromのすべてのバリエーションを探していますe1 in [0,1], e2 in [0,1,2,3] and e3 in [0,1,2]

4

6 に答える 6

5

itertools.product動的に指定された反復子のリストとともに使用します。

vals = [1,3,2]
for item in itertools.product(*[range(x+1) for x in vals]):
    print item

出力:

(0, 0, 0)
(0, 0, 1)
(0, 0, 2)
(0, 1, 0)
(0, 1, 1)
(0, 1, 2)
(0, 2, 0)
(0, 2, 1)
(0, 2, 2)
(0, 3, 0)
(0, 3, 1)
(0, 3, 2)
(1, 0, 0)
(1, 0, 1)
(1, 0, 2)
(1, 1, 0)
(1, 1, 1)
(1, 1, 2)
(1, 2, 0)
(1, 2, 1)
(1, 2, 2)
(1, 3, 0)
(1, 3, 1)
(1, 3, 2)
于 2013-08-24T21:58:10.140 に答える
5

Python の itertools モジュールには、必要なことを行うツールがあります。

import itertools
p = itertools.permutations([0, 1, 2, 3])
p_as_list = list(p)

編集:あなたのニーズはかなり具体的であるため、このようなことを行う独自の関数を持つことで利益を得ることができます:(私はまだ実装をダウンさせていないことに注意してください.

def magic_permutations (*args):
    lists = []
    larg = len(args)
    for i in range(larg):
        lists.append([])
    i = 0
    for nums in args: 
        for num in nums:
            if i >= larg:
                i = 0
            lists[i].append(num)
            i += 1
    return lists

編集:最初に質問を誤解したので、お詫び申し上げます。ただし、これはそのままにします。

于 2013-08-24T21:07:59.990 に答える
3

質問に示されている正確なシーケンスを取得するには (順序は異なりますが、問題ではありません)、次の関数を使用します。

import itertools as it

def combs(lst):
    return [list(e) for e in it.product(*(range(x+1) for x in lst))]

結果は期待どおりです。

combs([1, 3, 2])

=> [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [0, 1, 2],
    [0, 2, 0], [0, 2, 1], [0, 2, 2], [0, 3, 0], [0, 3, 1], [0, 3, 2],
    [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 1, 0], [1, 1, 1], [1, 1, 2],
    [1, 2, 0], [1, 2, 1], [1, 2, 2], [1, 3, 0], [1, 3, 1], [1, 3, 2]]
于 2013-08-24T21:54:52.477 に答える
1

numpy最後にタプルを取得しても構わない場合は、次のように使用します。

>>> import numpy as np
>>> e1=np.array([0,1])
>>> e2=np.array([0,1,2])
>>> e3=np.array([0,1,2,3])
>>> g=np.meshgrid(e1,e2,e3) #you need numpy ver>1.7.0, change the order of final result by changing the order of e1, e2, e3
>>> zip(*[item.flatten() for item in g])
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3)]
于 2013-08-24T22:19:07.630 に答える