我已经在文档和论坛中徘徊了一段时间,我还没有找到一个内置的方法/函数来完成删除数组中元素的简单任务。有没有这样的内置功能?
我要求相当于python的list.remove(x)。
这是一个天真地从框中挑选功能的例子:
deleteat!
Here提到使用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
,但也不起作用:
.then
答案 0 :(得分:11)
您也可以使用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])
答案 1 :(得分:10)
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!
。
答案 2 :(得分:3)
Julia的最新版本已弃用了其他几个答案。我目前(Julia 1.1.0)使用的是类似
function remove!(a, item)
deleteat!(a, findall(x->x==item, a))
end
如果您愿意,也可以使用findfirst
,但是如果a
不包含item
,则无法使用。
答案 3 :(得分:1)
根据用法,也可以了解mingw
并且它是就地版本mingw32-make
:
setdiff
但是,请注意,它还会删除所有重复的元素,如示例所示:
setdiff!
答案 4 :(得分:1)
您可以为此使用deleteat!
和findall
(与Julia> 1.0兼容)。
a=Any["D","A","s","t","s"]
deleteat!(a, findall(x->x=="s",a))
3-element Array{Any,1}:
"D"
"A"
"t"
答案 5 :(得分:0)
最近的答案是好的。但是,使用find___函数使用deleteat!()查找要删除的项目效率很低。我发现使用该代码的时间比所需时间长100倍,这完全是因为我正在使用该方法!
另一种方法是创建项及其索引的字典,以便在必要时可以简单地对其进行查找。
items # vector of items
itemindexes = IdDict(zip(items, eachindex(items))
todelete = Int[]
# do stuff and record indexes to delete with push!(todelete, <indexhere>)
sort!(todelete) # has to be in increasing order
deleteat!(items, todelete)
很明显,一旦使用deleteat!索引无效,因此您需要对其进行更新。