📦

かつてPythonistaだったあなたに捧ぐ。JavaScript配列をPythonっぽく扱うためのlodashメソッド

2024/04/18に公開

はじめに

私はかつてPythonをこよなく愛するPythonistaでした。
しかし、ひょんなことから人生の帰路に立たされ、JavaScriptを用いてWeb開発に携わることになりました。

そこに待ち受けていたのは、Pythonとは異なる言語構文でした。
中でもJavaScript配列の扱い方は、Pythonのリストとは異なるものでした。
※ 過去にも、PythonのinとJavaScriptのinの違いにつまづいたことがありました。

ですが、徐々に気づいたのです 💡。
JSとPythonの配列は全く異なるものではないということに。
特に、lodashというライブラリを知ってからは、
PythonのnumpypandasSeriesを使っている感覚で、JavaScriptの配列を扱える機会が増えました。

そこでこの記事では、Pythonistaの方が便利に感じるであろうlodashメソッドを紹介します。
Pythonから開発を始めた人がJavaScriptの配列に対するアレルギー反応を減らし、
開発体験が向上することを祈っております。🙏

下準備

環境

  • Python: 3.10.4

  • numpy: 1.2.5

  • pandas: 2.0.2

  • Node: v20.11.1

  • lodash: lodash-es@4.17.21

numpyとlodashはそれぞれ、pipnpm(or yarn)でインストールしてください。

pip install numpy
npm install lodash

テストデータ

import numpy as np
import pandas as pd

test_array = np.array([1,2,3,4,5,6,7,8,9])
test_array2 = np.array([10,11])
test_series = pd.Series(test_array)
test_multi_array = np.array([[1,2,3],[4,5,6],[7,8,9]])
test_non_unique_array = np.array([1,1,2,2,3,3])
const { _ : lodash } = require('lodash')

const testArray = [1,2,3,4,5,6,7,8,9]
const testArray2 = [10,11]
const testMultiArray = [[1,2,3],[4,5,6],[7,8,9]]
const testNonUniqueArray = [1,1,2,2,3,3]

lodashメソッド紹介

上位(下位)n件数表示: take / takeRight

先頭の要素取得: take

PythonSeries(もしくはDataFrame)の先頭をチェックする際には、head()メソッドを使いますね。

>>> print(test_series.head())
0    1
1    2
2    3
3    4
4    5
dtype: int64

ノートブックなどのRuntime環境で変数の中身をチェックする際に、嫌というほどおせわになりました。
デフォルトではそれぞれ上位5件が表示されますが、引数を指定することで表示件数を変更することもできます。

>>> print(test_series.head(3))
0    1
1    2
2    3

さて、JavaScriptの組み込みメソッドにはheadやがなくて困っていたそこのあなた 👉。
lodashには、おなじみのheadメソッドが存在します。

> console.log(lodash.head(testArray))
1

ただし、lodashのheadメソッドは、配列の先頭の1件のみを返します。
Pandas.Series``headとは異なり、引数を指定して取得件数を変更することもできません。

もし、配列の上位n件を取得したい場合は、takeメソッドを使いましょう。

> console.log(lodash.take(testArray, 5))
[1, 2, 3, 4, 5]

末尾の要素取得: tail

同様にPandas.Seriestailメソッドは、配列の末尾の要素を返しますね。

>>> print(test_series.tail())
4    5
5    6
6    7
7    8
8    9
dtype: int64

しかしlodashでは、tailメソッドが存在するものの、これはPandastailメソッドとは異なります。

> console.log(lodash.tail(testArray))
[
  2, 3, 4, 5,
  6, 7, 8, 9
]

lodashtailメソッドの仕様は、Pythonのtailとは異なり、
配列の末尾の要素を除いた配列を返します。

ですので、Pandas.Seriestailメソッドと同じような挙動を実現するためには、
takeRightメソッドを使いましょう。
takeRightメソッドは、配列の末尾からn件を取得します。

> console.log(lodash.takeRight(testArray, 5))
[5, 6, 7, 8, 9]

配列の結合: concat

numpyconcatenateメソッドは、複数のnp.ndarrayを結合する際に使います。

>>> print(np.concatenate([test_array, test_array2]))
[ 1  2  3  4  5  6  7  8  9 10 11]

pandas.Seriesならばappendconcatメソッドを使うことで、同様のことが再現できますね。

さて、上記のような配列の結合をlodashで実現するためには、concatメソッドを使いましょう。

> console.log(lodash.concat(testArray, testArray2))
[
   1, 2, 3, 4,  5,
   6, 7, 8, 9, 10,
  11
]

⚠️ Numpyconcatenateでは引数がリストであるのに対し、
lodashconcatは可変長引数を取りことに注意しましょう。
例えば、下記のように指定することで複数の配列を結合することもできます。

>  console.log(lodash.concat(testArray, testArray2, testArray2))
[
   1, 2, 3,  4,  5,  6,
   7, 8, 9, 10, 11, 10,
  11
]

1次元配列化: flatten

画像処理やNLPの分野では、よく多次元の配列を扱うことがあります。
numpyflattenメソッドは、多次元配列を1次元配列に変換する際におせわになりました。

>>> print(test_multi_array.flatten())
[1 2 3 4 5 6 7 8 9]

JavaScriptのlodashにも、flattenメソッドが存在します。

> console.log(lodash.flatten(testMultiArray))
[
  1, 2, 3, 4, 5,
  6, 7, 8, 9
]

flattenメソッドを知らないと、余分なmap処理を書いてしまうことがあるかもしれません。
flattenメソッドを使うことで、コードの可読性を向上させましょう 👆。

重複の除去: uniq

numpyuniqueメソッドは、配列内の重複を除去する際に重宝してくれました。

>>> print(np.unique(test_non_unique_array))
[1 2 3]

同様に、lodashにはuniqメソッドが存在します。

> console.log(lodash.uniq(testNonUniqueArray))
[ 1, 2, 3 ]

uniqメソッドを知らないと、余分なfilter処理を書いてしまうことがあるかもしれません。
uniqメソッドを使うことで、コードの可読性を向上させましょう 👆。

配列間の差分の抽出: difference

1つ目の配列に含まれるが、2つ目の配列に含まれない要素を抽出する際には、numpysetdiff1dメソッドが便利でしたね。

>>> print(np.setdiff1d(test_array, test_non_unique_array))
[4 5 6 7 8 9]

同様に、lodashにはdifferenceメソッドが存在します。

> console.log(lodash.difference(testArray, testNonUniqueArray))
[ 4, 5, 6, 7, 8, 9 ]

differenceメソッドを知らないと、mapと条件分岐を使って実装することになって、
若干ややこしいコードになるかもしれません。
やはり、lodashのメソッドは偉大ですね 👆。

まとめ

いかがでしたでしょうか。
NumpyPandasのメソッドを使っていたPythonistaの方にとっては、
lodashのメソッドは非常に使いやすいものだと感じられると思います。

今回ご紹介したメソッド以外にも、lodashには多くの便利なメソッドが存在します。
JavaScriptの配列処理でちょっとつまづいてしまった時、
Pythonにあったような1ライナーのコードが懐かしくなった時、
そんな時はぜひlodash公式ドキュメントを参照してみてください。
きっと数分前より幸せな気持ちになれるはずです。

GitHubで編集を提案

Discussion