配列(リスト)の一部を配列として取り出すには (subList / slice / array_slice)

配列(リスト)の一部を配列として取り出す方法。

関連

Go言語 (golang)

arr[start : end]

という書式で、配列の一部をスライスとして取り出すことができる。スライスは配列のビューになっており、スライスの要素を変更すると元の配列にも反映される。

arr := [4]int{1, 3, 5, 7}
fmt.Printf("%#v\n", arr)
# [4]int{1, 3, 5, 7}

sl := arr[1:2]
fmt.Printf("%#v\n", sl)
# []int{3}

sl2 := append(sl, 10)

fmt.Printf("%#v\n", arr)
# [4]int{1, 3, 10, 7}

fmt.Printf("%#v\n", sl)
# []int{3}

fmt.Printf("%#v\n", sl2)
# []int{3, 10}

配列だけでなくスライスのスライスも同じようにできる。

Java

配列

Signature:

新しい配列を生成して、そこに元の配列の一部をコピーする。

Signatureは2つしか書かなかったがすべてのプリミティブ型に対応するメソッドが用意されている。

返り値の配列の最後の要素は、元の配列のインデックス until - 1 の要素になる。

配列のコピーなので、返り値の配列の要素を変更しても、元の配列には反映されない。ただし、要素のオブジェクト自体はコピーしないので、要素のオブジェクトが可変の場合にそれを変更したら元の配列からも変更が見える。

java.util.List

Signature:

リストの一部のビューをリストとして取得できる。

返り値のリストの最後は、元のリストのインデックス until - 1 の要素になる。

subList で返されたリストを変更すると、元のリストにも反映される。

Scala

Signature:

返り値のリストの最後は、元のリストのインデックス until - 1 の要素になる。

PHP

array_slice関数を使う。引数は順番に配列、from、length。lengthを省略すると配列の最後までになる。

$arr = array(10, 20, 30, 40, 50);

var_export(array_slice($arr, 1, 2));
// 出力結果
// array (
//   0 => 20,
//   1 => 30,
// )

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

Python

以下はPythonのシーケンスといわれるリスト、タプル、文字列で共通操作で、スライス表記という。範囲を指定して部分リストを取得できる。

lst[from:until]

返り値のリストの最後は、元のリストのインデックス until - 1 になる。

fromuntil のどちらかまたは両方を省略できる。

lst[from:]  # from から最後まで
lst[:until] # 先頭から until - 1 まで
lst[:]      # 先頭から最後まで
lst[:-1]    # 先頭から、最後から数えて2番目まで

lst[:] の書き方はリストをコピーする目的で使える。 -> リストをコピーするには

スライス表記には3つ目の引数を与えることもでき、いくつおきに要素を抽出するかを表す。省略した場合は1とみなされる。

lst[::2]    # 1番目、3番目、、、と2つおき
lst[1::2]   # 2番め、4番目、、、と2つおき
lst[::-1]   # 逆順

スライス表記 (slicing) | Python 言語リファレンス
http://docs.python.jp/2.7/reference/expressions.html#slicing

Ruby / JRuby

Array#slice または Array#[] を使う。

arr.slice(from, length) # from から from + length - 1 まで
arr.slice(from..to)     # from から to まで (toを含む)
arr.slice(index)        # indexの要素のみを取得

length を省略したら、from以降の部分配列ではなく、その場所の要素を返す([] でインデックスを使った要素へのアクセスと同じ)。 arr.slice(index, 1) はその場所の要素だけの配列を返すので、これとも違う。

slice メソッドの代わりに [] も同じ使い方ができる。 at はこの使い方ができない。

slice[] を使った要素へのアクセスや範囲を指定してのアクセスは、 文字列に対しても全く同じ使い方ができる。

arr = [10, 20, 30, 40, 50]
s = 2
e = 3
p arr[s..e]
# => [30, 40]

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

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

Perl

my @arr = ('abc', 'def', 'ghi');
print "@arr[0..1]";     # => abc def
print "@arr[0,2]";      # => abc ghi
print "@arr[1..$#arr]"; # => def ghi

sh (シェルスクリプト)

配列ではないが、テキストファイルの一部を抽出するには sed を使うと簡単。

# 2行目から4行目を抽出(4行目を含む)
cat ファイル名 | sed -n 2,4p

関連

JavaScript

Array#slice(start[, end])
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク