Julia BoundersError在迭代列表时删除列表项

Julia BoundersError在迭代列表时删除列表项,julia,Julia,我想迭代一个列表,偶尔删除所述列表中的项目。下面是一个玩具示例: function delete_item!(myarray, item) deleteat!(myarray, findin(myarray, [item])) end n = 1000 myarray = [i for i = 1:n]; for a in myarray if a%2 == 0 delete_item!(myarray, a) end end 但是我得到了一个错误:

我想迭代一个列表,偶尔删除所述列表中的项目。下面是一个玩具示例:

function delete_item!(myarray, item)
    deleteat!(myarray, findin(myarray, [item]))
end

n = 1000
myarray = [i for i = 1:n];

for a in myarray
    if a%2 == 0
        delete_item!(myarray, a)
    end
end
但是我得到了一个错误:

BoundsError: attempt to access 500-element Array{Int64,1} at index [502]
我如何(尽可能有效地)修复它

补充资料。上面这似乎是一个愚蠢的例子,在我最初的问题中,我有一个交互的代理列表。因此,我不确定迭代副本是否是最佳解决方案。例如:

#creating my agent
mutable struct agent <: Any
    id::Int
end

function delete_item!(myarray::Array{agent, 1}, item::agent)
    deleteat!(myarray, findin(myarray, [item]))
end 

#having my list of agents
n = 1000
myarray = agent[agent(i) for i = 1:n];

#trying to remove agents from list while having them interact
for a in myarray
    #agent does stuff
    if a.id%2 == 0 #if something happens remove
        delete_item!(myarray, a)
    end
end
#创建我的代理

mutable struct agent不幸的是,这个问题没有单一的答案,因为最有效的方法取决于整个模型的逻辑(特别是其他代理的操作是否取决于某个条目实际上从数组中删除的事实)

在大多数情况下,以下方法应该是最简单的(我将离开
findin
,这是一种效率低下的方法,但我知道通常
myarray
中可能有重复的方法):

如果出于某种原因,您真的需要在每次迭代中删除
myarray
的元素,那么您可以这样做:

n = 1000
myarray = [i for i = 1:n];

i = 1
while i <= length(myarray)
    a = myarray[i]
    if a%2 == 0
        todelete = findin(myarray, [a])
        i -= count(x -> x < i, todelete) # if myarray has duplicates of a you have to move the counter back
        deleteat!(myarray, todelete)
    else
        i += 1
    end
end
n = 1000
myarray = [i for i = 1:n];

i = 1
while i <= length(myarray)
    a = myarray[i]
    if a%2 == 0
        deleteat!(myarray, i)
    else
        i += 1
    end
end
如果出于某种原因,您真的需要在每次迭代中删除
myarray
的元素,那么您可以这样做:

n = 1000
myarray = [i for i = 1:n];

i = 1
while i <= length(myarray)
    a = myarray[i]
    if a%2 == 0
        todelete = findin(myarray, [a])
        i -= count(x -> x < i, todelete) # if myarray has duplicates of a you have to move the counter back
        deleteat!(myarray, todelete)
    else
        i += 1
    end
end
n = 1000
myarray = [i for i = 1:n];

i = 1
while i <= length(myarray)
    a = myarray[i]
    if a%2 == 0
        deleteat!(myarray, i)
    else
        i += 1
    end
end
n=1000
myarray=[i代表i=1:n];
i=1

我很好,谢谢!我只是好奇你关于“findin”效率低下的评论,从这个问题()我认为这是移除特定元素的最佳方式。实际上,我的数组列表中没有重复项,因此如果有更好的替代“findin”的方法,我会很乐意使用它。你可以看到他们需要做的工作要少得多。你探索过过滤器吗!() ? 如是所示,尽管我认为在一次删除一个项目时,使用deleteat更有效!()?感谢您发布此问题-它促使Julia在此处改进行为。