Python での concat/flatten

Python でリストのリストを平らにする(あるいは連結する)なら、一番よいのは itertools.chain をつかう方法。

import itertools

flatten = itertools.chain.from_iterable

たとえばこんな風に使える:

list(flatten([[1, 2], [3, 4], [5]]))  # [1, 2, 3, 4, 5]

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]


この記事が気に入ったらサポートをしてみませんか?