LoginSignup
41
23

More than 3 years have passed since last update.

コピペはもうやめよう。Pythonでflattenするモジュールflatiの紹介

Posted at

ちゃお・・・†

はじめに

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 (題名は英語でお願いします)

厚かましいお願い

  • もしも気に入ったらflatiのGitHubリポジトリにスターをつけていただくと嬉しいです。たったの1クリックだけで、わたしの開発のモチベーションがアップします。
  • スターだけじゃ物足りない!という方は、flatiのGitHubリポジトリのSponsorボタンを押すとわたしにお金や物を送ることが出来ます。わたしの開発のモチベーションがかなりアップします。

さいごに

これから数日間は、とりあえず作ったものの全然宣伝していなかったモジュールとかを紹介していきたいと思います。

震えて待て・・・†

41
23
1

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
41
23