

Pythonを使って3次元配列の組み合わせを求めることに困っています。

liの番号はそれぞれli1～3に対応しており、結果を表す3次元配列lifinを求めたいです。

[code]

    start=0
    goal=10
    li1=[2,3]
    li2=[5,7]
    li3=[8,9]
    
    li=[[1],[1,2],[2,3],[1,2,3]]
    
[/code]

始点(start)は0、終点(goal)は10を表しています。

例えばli[1]=[1,2]ですが、これはstart→li1→li2→goalを表していて,結果として以下の様なものが導出して欲しいです。  
[[0,2,5,10],[0,2,7,10],[0,3,5,10],[0,3,7,10]]

最終的に、以下のlifinの様な結果を求めたいです。

[code]

    lifin=[[[0,2,10],[0,3,10]],
           [[0,2,5,10],[0,2,7,10],[0,3,5,10],[0,3,7,10]],
           [[0,5,8,10],[0,5,9,10],[0,7,8,10],[0,7,9,10]],
           [[0,2,5,8,10],[0,2,5,9,10],[0,2,7,8,10],[0,2,7,9,10],[0,3,5,8,10],[0,3,5,9,10],[0,3,7,8,9,10],[0,3,7,9,10]]]
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2015-11-19T09:00:13.730
19039
2015-11-19T10:56:41.447
13312
question
python
Pythonを使って3次元配列の組み合わせを求めることについて


前処理

[code]

    >>> from itertools import product
    >>> start=0
    >>> goal=10
    >>> M={}
    >>> M[1]=[2,3]
    >>> M[2]=[5,7]
    >>> M[3]=[8,9]
    >>> li=[[1],[1,2],[2,3],[1,2,3]]
    
[/code]

回答

[code]

    >>> result = []
    >>> for x in li:
    ...     r = []
    ...     for y in product(*[M[k] for k in x]):
    ...         r.append([start]+list(y)+[goal])
    ...     result.append(r)
    ... 
    >>> result
    [[[0, 2, 10], [0, 3, 10]], [[0, 2, 5, 10], [0, 2, 7, 10], [0, 3, 5, 10], [0, 3, 7, 10]], [[0, 5, 8, 10], [0, 5, 9, 10], [0, 7, 8, 10], [0, 7, 9, 10]], [[0, 2, 5, 8, 10], [0, 2, 5, 9, 10], [0, 2, 7, 8, 10], [0, 2, 7, 9, 10], [0, 3, 5, 8, 10], [0, 3, 5, 9, 10], [0, 3, 7, 8, 10], [0, 3, 7, 9, 10]]]
    
[/code]


CC BY-SA 3.0
2015-11-19T10:53:17.890
19046
2015-11-19T10:53:17.890
806
19039
answer


おそらく、`itertools.product`を探されていたのだと思います。  
`itertools.product`を使えば、あとは簡単ですので、ループなどで組み立てるだけです。

[code]

    #!/usr/bin/python3
    import itertools
    
    start = [0]
    goal = [10]
    num_lists = [
            None,
            [2, 3],
            [5, 7],
            [8, 9]
            ]
    chose_lists = [
            [1],
            [1, 2],
            [2, 3],
            [1, 2, 3],
            ]
    
    result = []
    
    for chose_list in chose_lists:
        chosen_num_lists = [num_lists[x] for x in chose_list]
        result.append([
            start + list(x) + goal
            for x in itertools.product(*chosen_num_lists)])
    
    from pprint import pprint
    pprint(result)
    
[/code]

結果

[code]

    [[[0, 2, 10], [0, 3, 10]],
     [[0, 2, 5, 10], [0, 2, 7, 10], [0, 3, 5, 10], [0, 3, 7, 10]],
     [[0, 5, 8, 10], [0, 5, 9, 10], [0, 7, 8, 10], [0, 7, 9, 10]],
     [[0, 2, 5, 8, 10],
      [0, 2, 5, 9, 10],
      [0, 2, 7, 8, 10],
      [0, 2, 7, 9, 10],
      [0, 3, 5, 8, 10],
      [0, 3, 5, 9, 10],
      [0, 3, 7, 8, 10],
      [0, 3, 7, 9, 10]]]
    
[/code]


CC BY-SA 3.0
2015-11-19T10:56:41.447
19047
2015-11-19T10:56:41.447
3054
19039
answer