Python での concat/flatten
Python でリストのリストを平らにする(あるいは連結する)なら、一番よいのは itertools.chain をつかう方法。
import itertools
flatten = itertools.chain.from_iterable
たとえばこんな風に使える:
flatten は(二重の)内包表記をつかって次のようにも定義できる:
flatten = lambda vss: (v for vs in vss for v in vs)
この lambda 式による定義は以下とおなじ:
def flatten(vss):
return (v for vs in vss for v in vs)
yield をつかって書きなおしてもいい:
def flatten(vss):
for vs in vss:
yield from vs
これは以下ともおなじ:
def flatten(vss):
for vs in vss:
for v in vs:
yield v
おなじことをするのに複数の書きかたがあるとき、基本的には短く書ける方法がよい。そしてすでに実装されているものがあるなら再発明は避けたい。
* * *
ところで適用対象をリストに限ることになるけれど、(そして戻り値もリストになってしまうけれど) sum でも実装できる。
concat = lambda lists: sum(lists, [])
concat([[1, 2], [3, 4], [5]]) # [1, 2, 3, 4, 5]
この記事が気に入ったらサポートをしてみませんか?