配列(リスト)から特定の値の要素をすべて削除するには (delete / remove / -)

配列(リスト)から値で要素を指定して削除する方法。

関連

Java

以下のメソッドは要素を1つだけ削除する。要素が見つかって削除した場合は true を返し、要素が見つからなかった場合は false を返す。

Signature:

要素の型が整数の List[Integer] という型の場合は、オートボクシングを期待して、 remove(3) のように呼びだしてしまうと、上記メソッドではなく、 remove(int) という別のメソッドを呼び出してしまう。 lst.remove(new Integer(3)) のようにする必要があるので、要注意。

Scala

不変(イミュータブル)なリストの類には、もちろん特定の要素を削除するメソッドはないのだが、削除した新しいリストを返すメソッドもないみたい。

seq.filter(_ != elem) みたいにフィルタリングすればよさそう。

val lst = List(10, 20, 30, 40, 50, 30);

val result = lst.filter(_ != 30);

println(result);
// List(10, 20, 40, 50)

ListBufferなどの可変(ミュータブル)なリストには --= がある。

PHP

新しい配列に1つずつ要素をコピーしていく方法

$target_elem = 30;

$arr = array(10, 20, 30, 40, 50, 30);
$new_arr = array();
foreach ($arr as $v) {
    if ($v != $target_elem) {
        $new_arr[] = $v;
    }
}

var_export($new_arr);
// 出力結果
// array (
//   0 => 10,
//   1 => 20,
//   2 => 40,
//   3 => 50,
// )

unset を使う方法。

$target_elem = 30;

$arr = array(10, 20, 30, 40, 50, 30);
while (($index = array_search($target_elem, $arr)) !== false) {
  unset($arr[$index]);
}
$arr = array_values($arr);

var_export($arr);
// 出力結果
// array (
//   0 => 10,
//   1 => 20,
//   2 => 40,
//   3 => 50,
// )

Python

リストにある remove メソッドを使う。

Python2/Python3での例

lst = [10, 20, 30, 40, 50, 30]
lst.remove(30)
print(lst)
# => [10, 20, 40, 50, 30]

指定の値を持つ最初の要素を削除する。同じ値の要素が複数あってもすべてを削除してくれるわけではなく、最初の要素のみを削除する。

要素が見つからなかった場合は ValueError: list.remove(x): x not in list というエラーを吐く。

Ruby / JRuby

Array#delete で指定した要素をすべて削除できる。これは破壊的な操作。

Array#- を使うと、複数の要素を指定でき、まとめて全部削除した結果の配列を返す。これはもともとの配列を変更しない。

いずれも同じ値の要素が複数あるとすべて削除してくれる。

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

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

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

arr.delete(30)
p arr
# => [10, 20, 40, 50]

2つは値の比較の基準が違うみたい。delete==を使い、-eql?が使われる。

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

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

CoffeeScript

特定の値をすべて削除するには

arr = (o for o in arr when o != remove_target)

関連

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