配列(リスト)の要素1つずつに関数を適用して新しい配列(リスト)を作るには (array_map / map)

各プログラミング言語での、配列(リスト)の要素1つずつに関数を適用して新しい配列(リスト)を作る方法。

要素1つずつに関数を適用したいが、副作用が目的で、返り値には興味がない場合はforeachを使う。

関連

Scala

scala.collection.Seq#map メソッドを使う。

Signature:

def scala.collection.Seq[A]#map[B](f: A => B): Seq[B]

val lst = List(10, 20, 30, 40, 50);
println(lst.map(_ * 2));
// => List(20, 40, 60, 80, 100)

PHP

array_map関数を使う。

array_map(function($elem){
  ...
  return ...;
}, $arr);

array_filter関数と引数の順番が違うので、要注意。

array_map 関数 | PHP Manual
http://php.net/manual/ja/function.array-map.php

ただし、array_map は遅いので、普通に foreach で回しながら新しい配列を作ったほうが速い、という話もある。

PHPで高速オシャレな配列操作を求めて | Qiita
http://qiita.com/Hiraku/items/190443b33ee7a2167ade

Python

map関数を使う例

lst = [10, 20, 30, 40, 50]

print map((lambda x: x * 2), lst)
# => [20, 40, 60, 80, 100]

リストの内包表記を使う例

lst = [10, 20, 30, 40, 50]

print [x * 2 for x in lst]
# => [20, 40, 60, 80, 100]

map関数では2つ以上の同じ長さのリストを与えることもできる。

lst1 = [10, 20, 30, 40, 50]
lst2 = [1, 2, 3, 4, 5]

print map((lambda x, y: x + y), lst1, lst2)
# => [11, 22, 33, 44, 55]

Ruby / JRuby

Enumerable#map を使う。ArrayEnumerableをインクルードしているので、Arrayでも使える。

さらにArrayには Array#map! という配列自身を変更するメソッドもある。

arr = [10, 20, 30, 40, 50]

p arr.map { |i| i * 2 }
# => [20, 40, 60, 80, 100]

p arr
# => [10, 20, 30, 40, 50]

arr.map! { |i| i * 2 } # 配列自身を変更
p arr
# => [20, 40, 60, 80, 100]

Enumerable#collectEnumerable#map とまったく同じで、 Array#collect!Array#map! とまったく同じ。

Enumerable#map, Enumerable#collect | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Enumerable/i/collect.html

Array#map!, Array#collect! | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/collect=21.html

全然関係ないが、enumerable という単語の読み方は英語では発音記号で書くと /ɪnjúːmərəbl/ らしい。

Perl

my @arr = (1, 2, 3);
my @arr2 = map { $_ * 2; } @arr;
print "@arr2";
# => 2 4 6

map 関数 | perldoc.jp
http://perldoc.jp/func/map

R言語

A <- c(1, 2, 5)
B <- mapply(function(x) x * 2, A)
# B: 2 4 10

CoffeeScript

配列の内包表記

(elemを使った式 for elem in arr)
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。