同じ値で埋めた配列(リスト)を作成するには (fill)

同じ値を並べた配列(リスト)を作成する方法。

Scala

Signature:

scala.collection.Seq.fill[A](n: Int)(elem: => A): Seq[A]
scala.collection.Seq.fill[A](n1: Int, n2: Int)(elem: => A): Seq[Seq[A]]
scala.collection.Seq.fill[A](n1: Int, n2: Int, n3: Int)(elem: => A): Seq[Seq[Seq[A]]]

上記はイミュータブル版で、以下のとおりミュータブル版もあるが、単に Seq と書くとイミュータブル版になる。

Signature:

scala.collection.mutable.Seq.fill[A](n: Int)(elem: => A): scala.collection.mutable.Seq[A]
scala.collection.mutable.Seq.fill[A](n1: Int, n2: Int)(elem: => A): scala.collection.mutable.Seq[scala.collection.mutable.Seq[A]]
scala.collection.mutable.Seq.fill[A](n1: Int, n2: Int, n3: Int)(elem: => A): scala.collection.mutable.Seq[scala.collection.mutable.Seq[scala.collection.mutable.Seq[A]]]

println(Seq.fill(3)(1.0));
// => List(1.0, 1.0, 1.0)

値は指定の数の回数だけ評価されるので、呼び出すごとに違う値を返す式を入れれば、違う値の入ったリストになる。

println(Seq.fill(3)(java.lang.Math.random()));
// => List(0.6325425328171801, 0.4376259819974295, 0.48787100947790263)

PHP

# インデックスが0から始まる、1 が3つの配列を生成
$arr = array_fill(0, 3, 1);
var_export($arr);
# 出力結果
# array (
#   0 => 1,
#   1 => 1,
#   2 => 1,
# )

PHP 5.6 よりも前のバージョンでは2つ目の引数が0だと PHP Warning: array_fill(): Number of elements must be positive という警告が出てしまう。

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

Python

# 1 が3つの配列を生成
lst = [1] * 3

# 0 が3×3の2次元配列を生成
lst = [[0] * 3 for i in range(3)]

2次元配列など、可変オブジェクトを要素とする配列の場合は注意。 *演算子は同じオブジェクトの繰り返しなので、どれか1つでも変更したら、全部の要素にそれが反映されてしまう。そうなってほしくない場合は内包表記を使う。

lst = [[1, 2, 3]] * 3
print(lst)
# => [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

# lst[0] lst[1], lst[2] は同じオブジェクトなので1つの変更が全部に反映される
lst[0][0] = 10
print(lst)
# => [[10, 2, 3], [10, 2, 3], [10, 2, 3]]

lst = [[1, 2, 3] for i in range(3)]
print(lst)
# => [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

lst[0][0] = 10
print(lst)
# => [[10, 2, 3], [1, 2, 3], [1, 2, 3]]

numpy

0.0で埋めたNumPyの配列を作るには

import numpy as np

print np.zeros(3)
# => [ 0.  0.  0.]

Ruby / JRuby

# 1 が3つの配列を生成
p [].fill(1, 0, 3)
# => [1, 1, 1]

# または
p Array.new(3, 1);
# => [1, 1, 1]

いずれの方法も要素がコピーされるわけではないので、可変オブジェクトで初期化する際には注意が必要。

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

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

Perl

x演算子を使う。Pythonの*みたいな使い方だが、記号はアスタリスクではなく、小文字のエックスである。

# 1 が3つの配列を生成
my @arr = (1) x 3;
print "@arr";
# => 1 1 1

x演算子でオブジェクトがコピーされるのではなく、同じオブジェクトが繰り返されるだけである。つまり要素が配列へのレファレンスの場合に、レファレンス先の配列を変更するとそれはすべてに反映される。

use Data::Dumper;

# 1 が3つの配列が4つある配列を生成
my @arr = ([1, 2, 3]) x 4;
print @$_ foreach @arr;
# 出力結果
# 123123123123

print Dumper \@arr;
# 出力結果
# $VAR1 = [
#           [
#             1,
#             2,
#             3
#           ],
#           $VAR1->[0],
#           $VAR1->[0],
#           $VAR1->[0]
#     ];

$arr[0][0] = 9;
print @$_ foreach @arr;
# 出力結果
# 923923923923

print Dumper \@arr;
# 出力結果
# $VAR1 = [
#           [
#             9,
#             2,
#             3
#           ],
#           $VAR1->[0],
#           $VAR1->[0],
#           $VAR1->[0]
#     ];

乗法演算子 | perldoc.jp
http://perldoc.jp/docs/perl/5.20.1/perlop.pod#Multiplicative32Operators

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。