ちゃお・・・†
はじめに
Pythonでネストしている (入れ子構造になってる) リストを1つのリストにまとめたい、つまりflattenしたい時ってたまにありますよね。そうした場合に対処する情報もWeb検索すればすぐ出てきますよね。でも、それをいちいちコピペするのって正直めんどくさくないですか?わたしはめんどくさい。というわけで、この記事ではPythonでflattenするモジュールflati
を紹介します。
現時点ではPython 2.7とPython 3.4~3.8対応です。Pure-Pythonモジュールなので、対応しているPython環境さえあれば、Windows/macOS/Ubuntuなど色々なプラットフォームで動くと思います。
名前の由来
flatten処理とFulvio Fratiさん (一緒に研究したことある先生) をかけてflati
と名付けました。「ふらてぃ」と発音してください。
インストール
$ pip install flati
or
$ python -m pip install flati
使い方
import flati
# flati.flatten()は入れ子になってるIterableオブジェクトを1要素ごとに返すジェネレーターです。
# 返却値を1つのIterableオブジェクトにまとめたい場合はlist()などを使ってください。
iterable = [(1, 2, 3), (4, (5, 6))]
list(flati.flatten(iterable))
# => [1, 2, 3, 4, 5, 6]
# もう1度書きます。flati.flatten()はジェネレーターです。
import types
isinstance(flati.flatten(iterable), types.GeneratorType)
# => True
# もし、ある特定のIterableオブジェクトをflattenしたくない場合は、"ignore"引数で指定してください。
iterable = [('abc'), ('def', ('g', 'hi'))]
list(flati.flatten(iterable, ignore=str))
# => ['abc', 'def', 'g', 'hi']
Tips
もしもNumPyのndarray
をflattenしたい時は、NumPyの関数を使ってください。そっちの方が速いです。
- numpy.ravel()
- コピーを作らないでオブジェクトを変更します。つまり破壊的処理です。
- ndarray.reshape(-1)
- ビューを生成するので、
numpy.ravel()
と同じく高速処理に向いています。個人的にはこれが一番おすすめです。 - ndarray.flatten()
- これはコピー処理を行うので若干遅いですが、破壊的処理でないので元の
ndarray
を保つことが出来ます。
参考: https://python.atelierkobato.com/flat/
先行事例
PyPIで "flatten" をクエリーにして検索して出てきたものを紹介します。dict
型をflattenするものは対象外とします。
- flatten-list
- ドキュメントのリンクが切れています。2017年8月でリリースが止まっています。
str
型とbytes
型のみflattenしないようにハードコーディングされています。 - flatter
- ドキュメントがありません。2016年8月でリリースが止まっています。ソースコードを見ると何やら複雑な処理を行っているのでオーバーヘッドはどうなんでしょう?
- FlattenList
- 2015年1月でリリースが止まっています。GitHub等での公開リポジトリがないのが不安かも。
- Flattener
- 2016年3月でリリースが止まっています。
ignore
引数がないのでstr
だけflattenしたくない時などに困るかも。 - flatlist
- 名前の通り
list
型しか対応していません。2018年12月でリリースが止まっています。ドキュメントはしっかりしています。
疲れたのでこの辺にしておきます。
flatiを使うメリット
- Web検索して出てきたコードをコピペしなくて済む
- IterableなオブジェクトならなんでもOK
-
ignore
引数でflattenしたくない型を指定できる - ジェネレーターなので巨大データを扱う場合にメモリ使用量がやさしい
- モジュール名の文字数が少なめ (5文字)
- 実装がシンプル (ソースコード)
- Pure-Pythonモジュールなので気軽に色々なプラットフォームで動く
- リクエストやバグ報告/修正についてのIssueとPull requestは日本語でもOK (題名は英語でお願いします)
- くわしくはこちら: https://github.com/ikegami-yukino/flati/blob/master/CONTRIBUTING.md
厚かましいお願い
- もしも気に入ったらflatiのGitHubリポジトリにスターをつけていただくと嬉しいです。たったの1クリックだけで、わたしの開発のモチベーションがアップします。
- スターだけじゃ物足りない!という方は、flatiのGitHubリポジトリのSponsorボタンを押すとわたしにお金や物を送ることが出来ます。わたしの開発のモチベーションがかなりアップします。
さいごに
これから数日間は、とりあえず作ったものの全然宣伝していなかったモジュールとかを紹介していきたいと思います。
震えて待て・・・†