如何在Julia中按值从数组中删除元素?

drz*_*bir 2 julia

我在Julia中有一个简单的程序:

a = [1, 2, 3, 10, 20, 30]
delete!(a, 10)
Run Code Online (Sandbox Code Playgroud)

但它不起作用。错误是MethodError: no method matching delete!(::Array{Int64,1}, ::Int64)

我可以看到deleteat!splice!接受索引而不是值。

如何10aJulia中的数组中删除元素?

Rah*_*hul 5

使用filter!功能过滤值10。的?(类型\ne和按TAB)就派上用场了!

julia> a = [1, 2, 3, 10, 20, 30]
6-element Array{Int64,1}:
  1
  2
  3
 10
 20
 30

julia> filter!(x->x?10,a)
5-element Array{Int64,1}:
  1
  2
  3
 20
 30

julia>
Run Code Online (Sandbox Code Playgroud)

如果阵列中有多个10,则该解决方案甚至可以使用。

julia> a = [1,10,10]
3-element Array{Int64,1}:
  1
 10
 10

julia> filter!(x->x?10,a)
1-element Array{Int64,1}:
 1
Run Code Online (Sandbox Code Playgroud)

  • 再次指出,`deleteat!(a,findfirst(a,10))'的速度快30%以上,但仅可删除等于10的第一个元素(如果没有这样的元素则会出错,但是可以固定)。它可能与关键代码部分中的代码有关。 (2认同)

Tas*_*nou 5

从文档 deleteat!

deleteat!(a::Vector, inds)

删除由 给出的索引处的项目inds,并返回修改后的a。随后的项目被转移以填补由此产生的空白。

inds可以是迭代器或排序的唯一整数索引的集合,也可以是长度a与 true相同的布尔向量,指示要删除的条目

(强调我的)。

即,您可以简单地测试(元素)相等性,并将其用于“布尔索引”,就像普通数组一样:

deleteat!(a, a .== 10);
Run Code Online (Sandbox Code Playgroud)

PS:或者如果你只想删除第一个:deleteat!(a, findfirst(a .== 10));