LoginSignup
2
0

More than 5 years have passed since last update.

PyFunctionalでPythonでもRubyやJSみたいにメソッドチェーンでラクラク配列操作する

Last updated at Posted at 2018-12-12

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 * 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:

2
0
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
2
0