如何在Julia中按值从数组中删除元素?
我在Julia有一个简单的程序:如何在Julia中按值从数组中删除元素?,julia,Julia,我在Julia有一个简单的程序: a = [1, 2, 3, 10, 20, 30] delete!(a, 10) 但它不起作用。错误是MethodError:没有与删除匹配的方法!(::数组{Int64,1},::Int64) 我可以看到deleteat和拼接接受索引而不是值 如何从Julia中的数组a中删除元素10?使用过滤器用于过滤值10的函数。≠(键入\ne并按选项卡)就可以使用了 julia> a = [1, 2, 3, 10, 20, 30] 6-element Array{
a = [1, 2, 3, 10, 20, 30]
delete!(a, 10)
但它不起作用。错误是MethodError:没有与删除匹配的方法!(::数组{Int64,1},::Int64)
我可以看到deleteat代码>和拼接代码>接受索引而不是值
如何从Julia中的数组a
中删除元素10
?使用过滤器代码>用于过滤值10
的函数。≠代码>(键入\ne
并按选项卡
)就可以使用了
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>
如果阵列中有多个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
从deleteat代码>
deleteat!(a::矢量,inds)
删除inds
给出的索引处的项目,并返回修改后的a
。随后的项目被转移以填补产生的空白
inds
可以是迭代器,也可以是已排序且唯一的整数索引的集合,或者是长度与a
相同的布尔向量,其中true表示要删除的条目
(我的重点)
也就是说,您可以简单地测试(elementwise)相等性,并像普通数组一样将其用于“布尔索引”:
deleteat!(a, a .== 10);
PS:或者如果您只想删除第一个:deleteat!(a,findfirst(a==10)) 是要删除数组中的元素10
,还是要删除值为10
的元素?这不是一回事吗?我希望数组是a=[1,2,3,20,30]
。您希望如何处理多个事件?要删除所有10
s,可以使用filter!(x->x!=10,a)
。假设我没有多次出现。(idx=findfirst(a,10))>0?删除!(a,idx):a
也是一个选项(当10
只出现一次时有效。当然,10
应该被一个变量替换成一个函数。过滤器!
解决方案会更清晰。只需再次注意,deleteat!(a,findfirst(a,10))
快了30%,但只适用于删除等于10的第一个元素(如果没有这样的元素,则会出现错误,但这是可以修复的)。它可能与关键代码部分相关。如果您只想删除元素的一个实例,而不是所有实例,那么它也很有用。语法也已更改,您现在需要使用findfirst(x->x==10,a)
。谓词函数构造的开销可能并不小,因此除了在第一次出现后提前中断循环外,这还可以解释一些性能差异。