Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away