

pythonで3次元配列を2次元配列に変換したい。

[code]

    li=[[[1,2],[2,5,8]],[[1,5,9],[9,10,11],[11,13]],[[2,6,12],[12,17,15],[15,3,2]]]    
    
    li=[[1,2,5,8],[1,5,9,10,11,13],[2,6,12,17,15,3,2]]    
    
[/code]

上記の例のように変換したいです。よろしくお願いします。


CC BY-SA 3.0
2015-11-15T12:05:10.647
18849
2015-11-16T01:04:00.343
13226
question
python
pythonで3次元配列を2次元配列に変換したい


データ通りに実装するとこのようになります。

[code]

    >>> li=[[[1,2],[2,5,8]],[[1,5,9],[9,10,11],[11,13]],[[2,6,12],[12,17,15],[15,3,2]]]    
    >>> result = []
    >>> for x in li:
    ...     r = []
    ...     for y in x:
    ...         if r and r[-1] == y[0]:
    ...             r.extend(y[1:])
    ...         else:
    ...             r.extend(y)
    ...     result.append(r)
    ...
    >>> result
    [[1, 2, 5, 8], [1, 5, 9, 10, 11, 13], [2, 6, 12, 17, 15, 3, 2]]
    
[/code]


CC BY-SA 3.0
2015-11-15T15:30:30.713
18855
2015-11-15T15:30:30.713
806
18849
answer


`li[i][j][-1]` と `li[i][j+1][0]` が同じ値、という前提が成り立つ場合。

[code]

    >>> [sum([y[:-1] for y in x[:-1]], []) + x[-1] for x in li]
    [[1, 2, 5, 8], [1, 5, 9, 10, 11, 13], [2, 6, 12, 17, 15, 3, 2]]
    
[/code]

もしくは、

[code]

    >>> [x[0] + sum([y[1:] for y in x[1:]], []) for x in li]
    [[1, 2, 5, 8], [1, 5, 9, 10, 11, 13], [2, 6, 12, 17, 15, 3, 2]]
    
[/code]

※ Kenji Noguchi さんのコメントから

> ならば `print [sum([y[1:] for y in x[1:]], x[0]) for x in li]` これが一番シンプルかも。


CC BY-SA 3.0
2015-11-15T22:21:20.780
18860
2015-11-15T22:46:18.887
2015-11-15T22:46:18.887
18849
answer


forループ無しで解いてみました。

[code]

    li=[[[1,2],[2,5,8]],[[1,5,9],[9,10,11],[11,13]],[[2,6,12],[12,17,15],[15,3,2]]]
    print map(lambda e: reduce(lambda a, b: a + b[1:], e), li)
    
[/code]


CC BY-SA 3.0
2015-11-16T01:04:00.343
18863
2015-11-16T01:04:00.343
7837
18849
answer