データのフラット化

この記事は Python Tips Advent Calendar 2012 15日目の記事です。


2次元のデータを1次元のデータにしてしまいたいときがあります。その場合、リストに対しては以下のように書けます。

>>> xss = [[1, 2], [3], [4, 5, 6]]
>>> sum(xss, [])
[1, 2, 3, 4, 5, 6]

タプルでも同様に書けます。
ただし、内側のデータが、ジェネレータなどの一度しか走査できないものに対してはこの方法では無理です。
そういう場合は 内包表記いろいろ で説明した多重 for を使うといいです。

>>> [x for xs in xss for x in xs]
[1, 2, 3, 4, 5, 6]

また、リスト化するとメモリに収まらないほど巨大なデータになってしまう、あるいは全てのデータが必要な訳ではないなら、これらの処理を itertools.chain で繋げるのがいいでしょう。

>>> from itertools import chain
>>> list(chain(*xss))
[1, 2, 3, 4, 5, 6]


.