1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python: ジェネレータでちょうどいいflat / flat_mapを作ってみた

Last updated at Posted at 2020-12-14

何かちょうどいいのが見当らなかったので自前で作ってみました。どっかにあるのかな?
「ちょうどいいの」 とは:

  • [[0], [1], [2]] -> [0, 1, 2] :flatの基本機能。あたりまえか
  • [0, [1], [[2]]] -> [0, 1, [2]] :リストでない要素はそのまま。一段だけ。再帰なし。
  • [(0, 1), {'a':2, 'b':3}, "45", [6, 7]] -> [(0, 1), {'a': 2, 'b': 3}, '45', 6, 7] :listにだけ作用する。ほかの iterable には反応しない。

ぼくの方では、flat 単体で使うシーンはほぼないので、flatmapを成立させてくれればそれでよいのです。それがぼくにとっての「ちょうどよい」ってことになります。まあ人によりけりですが、あなたはどうですか?


flat = lambda xs : (
    y
    for x in xs
    for y in (
        [x] if type(x) is not list else
        x
        )
    )

リストじゃないやつは一旦リストに持ち上げてからバラす作戦です。
Pythonの流儀に合わせて、ジェネレータにしました。

これを使えば flat_map はこうなります。

flat_map = lambda f, xs : flat( map( f, xs ) )

他にちょうどいいのがあれば コメント よろしくお願いします。

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?