PythonでUnderscore.jsのような配列操作
PythonでUnderscore.jsのような配列操作:
JavaScriptで書いてると、Underscore.jsがとても便利でしてな(´・ω・`)
Pythonで配列操作やろうとした時に迷うことが多いので、自分用に対応表を作っておくことにしました。いいやり方見つけるたびにアップデートしていこうと思います。
基本的な配列操作(append/insert/pop/extend/+/*/スライス)は省略。
JavaScriptで書いてると、Underscore.jsがとても便利でしてな(´・ω・`)
Pythonで配列操作やろうとした時に迷うことが多いので、自分用に対応表を作っておくことにしました。いいやり方見つけるたびにアップデートしていこうと思います。
基本的な配列操作(append/insert/pop/extend/+/*/スライス)は省略。
対応表
Underscore.js | Python | 結果(Python) | 動作 |
---|---|---|---|
_.indexOf([1, 2, 3], 2) | [1, 2, 3].index(2) | 1 | 配列のどこにあるかインデックスを返す。なければ-1 |
_.lastIndexOf([1, 2, 3, 2], 2) | (lambda array, val: len(array)-1 - array[::-1].index(val))([1, 2, 3, 2], 2) | 3 | 配列の後ろから検索してindexを返す。なければ-1。Python版は逆順配列を新たに作るので巨大な配列には使用しない |
_.find([1, 2, 3], (val)=>{ return val == 2; }) | next((val for val in [1, 2, 3] if val == 2), None) | 2 | 配列の中に条件の合う値が存在すればそれを返す。無ければundefined/None |
_.contains([1, 2, 3], 2) | 2 in [1, 2, 3] | True | 配列に含まれるかどうかbooleanで返す |
_.every([1, 2, 3], (val)=>{ return val < 10; }) | all(val < 10 for val in [1, 2, 3]) | True | 配列の内容が全て条件に当てはまるか |
_.some([1, 2, 3], (val)=>{ return val < 2; }) | any(val < 2 for val in [1, 2, 3]) | True | 配列の内容が1つでも条件に当てはまるか |
_.filter([1, 2, 3], (val)=>{ return val%2 != 0; }) | [val for val in [1, 2, 3] if val%2 != 0] | [1, 3] | 条件に一致した値だけ抜き出す |
_.map([1, 2, 3], (val)=>{ return val+1; }) | [val+1 for val in [1, 2, 3]] | [2, 3, 4] | 配列の値を加工した新たな配列を作る |
_.uniq([1, 2, 3, 2, 1]) | list(set([1, 2, 3, 2, 1])) | [1, 2, 3] | 重複を取り除く(※Pythonは順不同) |
_.difference([1, 2, 3, 4, 5], [5, 2, 10]) | [val for val in [1, 2, 3, 4, 5] if val not in list(set([5, 2, 10]))] | [1, 3, 4] | 別の配列に存在しない値だけを返す |
_.zip([1, 2], ["a", "b"], [true, false]) | list(zip([1, 2], ["a", "b"], [True, False])) | [(1, 'a', True), (2, 'b', False)] | 各配列の先頭要素から順番にグルーピングして1つの配列に |
_.unzip([[1, 'a', true], [2, 'b', false]]) | list(zip(*[[1, 'a', True], [2, 'b', False]])) | [(1, 2), ('a', 'b'), (True, False)] | zipの逆動作。配列をバラして各グループでzipしなおす |
コメント
コメントを投稿