配列(リスト)の要素1つずつに関数を適用して結果の配列を連結した新しい配列を作るには (flatMap)

map関数flatten関数をつなげたイメージ。

Scala

Signature:

val lst1 = List(1, 2, 3);
val result = lst1.flatMap(0 until _);
println(result);
// => List(0, 0, 1, 0, 1, 2)

flatMapメソッドは結果を新しいリストで返し、自身は変更しない。

Python

リストの内包表記でforを入れ子にして内側のforの中に関数を書けばできる。

def f(i):
    return range(i)

lst = [1, 2, 3]

lst2 = [e2 for e1 in lst for e2 in f(e1)]

print(lst2)
# => [0, 0, 1, 0, 1, 2]

Ruby / JRuby

Enumerable#flat_map を使う。 ArrayEnumerableをインクルードしているので、配列でもEnumerableのメソッドを使える。

または Enumerable#mapArray#flatten を組み合わせても同じことはできる。

arr = [1, 2, 3]

p arr.flat_map { |i| (0..i).to_a }
# => [0, 1, 0, 1, 2, 0, 1, 2, 3]

p arr.map { |i| (0..i).to_a }.flatten(1)
# => [0, 1, 0, 1, 2, 0, 1, 2, 3]

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

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

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

Enumerable#flat_map はRuby 1.9かららしい。

Perl

簡単にこれをやる関数はないので、例えば以下のように処理する。

my @srcList = ...;
my @result = ();
foreach my $elem (@srcList) {
    my @newElements = f($elem);
    foreach my $newElement (@newElements) {
        push(@result, $newElement);
    }
}
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク