私はしばらくの間ドキュメントやフォーラムでさまよっていましたが、配列の要素を削除する簡単なタスクを実行するための組み込みのメソッド/関数を見つけていません。そのような組み込み関数はありますか?
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
_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])
です
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!
。
他のいくつかの回答は、Juliaの最近のリリースで非推奨になりました。私は現在(Julia 1.1.0)のようなものを使用しています
function remove!(a, item)
deleteat!(a, findall(x->x==item, a))
end
必要に応じてfindfirst
を使用することもできますが、a
にitem
が含まれていない場合は機能しません。
使用法にもよりますが、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