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


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]

よろしくお願いします。




前処理

[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]

