simple-web-system technology

Webに関する技術をシンプルに扱うブログ

PyFunctionalでPythonでもRubyやJSみたいにラクラク配列操作する

TL;DR

PythonでもPyFunctionalってライブラリ入れれば楽に配列操作できるよってお話

注意書き

この記事は基本的にPython3の話です。

インストール方法

pip3 install pyfunctional

使用例

Pythonは配列操作がRubyやJSと違って大変です。

例えば、0から9までの数字で偶数のものを2乗した配列が欲しいとします。 (お題は適当に考えたから深く気にしないで)

例:Ruby

Rubyだと以下のように書けます。 すごく楽でいいです:relaxed:

numbers = (0..9).select { |n|
  n % 2 == 0
}.map {
  n * n
}

print numbers
# [0, 4, 16, 36, 64]

例:JavaScript

JavaScriptだとこうなります。 JavaScriptにも連番作る関数ください。

var numbers = [...Array(10).keys()]
                .filter(n => n % 2 == 0)
                .map(n => n * n)

console.log(numbers)
// [0, 4, 16, 36, 64]

例:Python

pythonだと以下のようになります。 辛い……:sob:

numbers = []
for n in range(10):
  if (n % 2 == 0):
    numbers.append(n * n)

print(numbers)
# [0, 4, 16, 36, 64]

例:Python(lambda)

lambdaを使うと以下のようになります。 括弧の対応も改行どこでしていいのかもわからない……:sob:

numbers = list(map(lambda n: n * n, filter(lambda n: n % 2 == 0, range(10))))
print(numbers)
# [0, 4, 16, 36, 64]

例:Python + PyFunctional

満を持して、PyFunctionalを使うとRubyやJSのようにメソッドチェーンで書けます。

from functional import seq

# 改行のために括弧で挟む。
numbers = (seq(range(10))
            .filter(lambda n: n % 2 == 0)
            .map(lambda n: n * n)
          )

# 括弧じゃないほうがいいなら、行末にバックスラッシュをつける。
numbers = seq(range(10))\
            .filter(lambda n: n % 2 == 0)\
            .map(lambda n: n * n)

print(numbers)
# [0, 4, 16, 36, 64]

使い方を簡単に言うと、seqに配列を渡して、それに必要なメソッドをチェーンしていく感じです。 感覚はRubyと同じですよね。

使えるメソッドに関してはGithubにある公式リポジトリで確認してください。 PyFunctional - Github

まとめ

PyFunctionalで快適な配列ライフを!:grin: