web-dev-qa-db-ja.com

juliaの配列の要素を削除する

私はしばらくの間ドキュメントやフォーラムでさまよっていましたが、配列の要素を削除する簡単なタスクを実行するための組み込みのメソッド/関数を見つけていません。そのような組み込み関数はありますか?

Pythonのlist.remove(x)に相当するものを求めています。

ボックスから関数を単純に選択する例を次に示します。

Julia> a=Any["D","A","s","t"]
Julia> pop!(a, "s")
ERROR: MethodError: `pop!` has no method matching       
pop!(::Array{Any,1},     ::ASCIIString)
Closest candidates are:
  pop!(::Array{T,1})
  pop!(::ObjectIdDict, ::ANY, ::ANY)
  pop!(::ObjectIdDict, ::ANY)
  ...

ここ 使用する言及deleteat!、しかし動作しません:

Julia> deleteat!(a, "s")
ERROR: MethodError: `-` has no method matching -(::Int64, ::Char)
Closest candidates are:
  -(::Int64)
  -(::Int64, ::Int64)
  -(::Real, ::Complex{T<:Real})
  ...

 in deleteat! at array.jl:621
16
user2820579

_filter!_を使用することもできます:

_a = Any["D", "A", "s", "t"]
filter!(e->e≠"s",a)
println(a)
_

与える:

_Any["D","A","t"]
_

これにより、次のように複数の値を一度に削除できます。

_filter!(e->e∉["s","A"],a)
_

注1:Julia 0.5では、匿名関数ははるかに高速であり、0.4で感じられる小さなペナルティはもう問題ではありません:-)。

注2:上記のコードはUnicode演算子を使用しています。通常の演算子の場合:__は_!=_であり、_e∉[a,b]_は!(e in [a,b])です

11
Dan Getz

deleteat! + findinはそれを行います:

a = Any["D", "A", "s", "t"]
deleteat!(a, findin(a, ["s"])) # => ["D", "A", "t"]

それの訳は pop!には、配列内の特定の要素を削除するメソッドはありません。最後の要素のみを削除し、deleteat!には、削除する要素のインデックスが必要です。関数が持つメソッドはmethodsで確認できます:

methods(pop!)
methods(deleteat!)

Dictの場合、要素のキーをフィードして、delete!

10
amrods

他のいくつかの回答は、Juliaの最近のリリースで非推奨になりました。私は現在(Julia 1.1.0)のようなものを使用しています

function remove!(a, item)
    deleteat!(a, findall(x->x==item, a))
end

必要に応じてfindfirstを使用することもできますが、aitemが含まれていない場合は機能しません。

4
NoseKnowsAll

使用法にもよりますが、setdiffとインプレースバージョンsetdiff!

Julia> setdiff([1,2,3,4], [3])
3-element Array{Int64,1}:
 1
 2
 4

ただし、次の例に示すように、繰り返し要素もすべて削除されることに注意してください。

Julia> setdiff!([1,2,3,4, 4], [3])
3-element Array{Int64,1}:
 1
 2
 4
1
张实唯