删除julia数组中的元素

时间:2016-02-09 17:52:26

标签: arrays julia

我已经在文档和论坛中徘徊了一段时间,我还没有找到一个内置的方法/函数来完成删除数组中元素的简单任务。有没有这样的内置功能?

我要求相当于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

6 个答案:

答案 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!索引无效,因此您需要对其进行更新。