かつてPythonistaだったあなたに捧ぐ。JavaScript配列をPythonっぽく扱うためのlodashメソッド
はじめに
私はかつてPythonをこよなく愛するPythonistaでした。
しかし、ひょんなことから人生の帰路に立たされ、JavaScriptを用いてWeb開発に携わることになりました。
そこに待ち受けていたのは、Pythonとは異なる言語構文でした。
中でもJavaScript配列の扱い方は、Pythonのリストとは異なるものでした。
※ 過去にも、Pythonのin
とJavaScriptのin
の違いにつまづいたことがありました。
ですが、徐々に気づいたのです 💡。
JSとPythonの配列は全く異なるものではないということに。
特に、lodash
というライブラリを知ってからは、
Pythonのnumpy
やpandas
のSeries
を使っている感覚で、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はそれぞれ、pip
とnpm
(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.Series
のtail
メソッドは、配列の末尾の要素を返しますね。
>>> print(test_series.tail())
4 5
5 6
6 7
7 8
8 9
dtype: int64
しかしlodash
では、tail
メソッドが存在するものの、これはPandas
のtail
メソッドとは異なります。
> console.log(lodash.tail(testArray))
[
2, 3, 4, 5,
6, 7, 8, 9
]
lodash
のtail
メソッドの仕様は、Pythonのtail
とは異なり、
配列の末尾の要素を除いた配列を返します。
ですので、Pandas.Series
のtail
メソッドと同じような挙動を実現するためには、
takeRight
メソッドを使いましょう。
takeRight
メソッドは、配列の末尾からn件を取得します。
> console.log(lodash.takeRight(testArray, 5))
[5, 6, 7, 8, 9]
配列の結合: concat
numpy
のconcatenate
メソッドは、複数のnp.ndarray
を結合する際に使います。
>>> print(np.concatenate([test_array, test_array2]))
[ 1 2 3 4 5 6 7 8 9 10 11]
pandas.Series
ならばappend
やconcat
メソッドを使うことで、同様のことが再現できますね。
さて、上記のような配列の結合をlodashで実現するためには、concat
メソッドを使いましょう。
> console.log(lodash.concat(testArray, testArray2))
[
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11
]
⚠️ Numpy
のconcatenate
では引数がリストであるのに対し、
lodash
のconcat
は可変長引数を取りことに注意しましょう。
例えば、下記のように指定することで複数の配列を結合することもできます。
> console.log(lodash.concat(testArray, testArray2, testArray2))
[
1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 10,
11
]
1次元配列化: flatten
画像処理やNLPの分野では、よく多次元の配列を扱うことがあります。
numpy
のflatten
メソッドは、多次元配列を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
numpy
のunique
メソッドは、配列内の重複を除去する際に重宝してくれました。
>>> 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つ目の配列に含まれない要素を抽出する際には、numpy
のsetdiff1d
メソッドが便利でしたね。
>>> 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
のメソッドは偉大ですね 👆。
まとめ
いかがでしたでしょうか。
Numpy
やPandas
のメソッドを使っていたPythonistaの方にとっては、
lodash
のメソッドは非常に使いやすいものだと感じられると思います。
今回ご紹介したメソッド以外にも、lodash
には多くの便利なメソッドが存在します。
JavaScriptの配列処理でちょっとつまづいてしまった時、
Pythonにあったような1ライナーのコードが懐かしくなった時、
そんな時はぜひlodash
の公式ドキュメントを参照してみてください。
きっと数分前より幸せな気持ちになれるはずです。
Discussion