何かちょうどいいのが見当らなかったので自前で作ってみました。どっかにあるのかな?
「ちょうどいいの」 とは:
-
[[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 ) )
他にちょうどいいのがあれば コメント よろしくお願いします。