Удалить элемент в массиве для julia
Я некоторое время блуждал в документах и на форумах, и я не нашел встроенный метод/функцию для выполнения простой задачи по удалению элемента в массиве. Есть ли такая встроенная функция?
Я прошу эквивалент python list.remove(x).
Вот пример наивного выбора функции из окна:
julia> a=Any["D","A","s","t"]
julia> pop!(a, "s")
ERROR: MethodError: `pop!` has no method matching
pop!(::Array{Any,1}, ::ASCIIString)
Closest candidates are:
pop!(::Array{T,1})
pop!(::ObjectIdDict, ::ANY, ::ANY)
pop!(::ObjectIdDict, ::ANY)
...
Здесь упоминается использование deleteat!
, но также не работает:
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
Ответы
Ответ 1
Вы также можете выбрать 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])
Ответ 2
deleteat!
+ findin
сделает это:
a = Any["D", "A", "s", "t"]
deleteat!(a, findin(a, ["s"])) # => ["D", "A", "t"]
это связано с тем, что pop!
не имеет метода для исключения определенного элемента в массиве, он устраняет только последний, а deleteat!
нужен индекс элемента, который вы хотите устранить. Вы можете проверить методы, которые имеет функция с methods
:
methods(pop!)
methods(deleteat!)
При a Dict
вы можете подать ключ элемента для исключения до delete!
.
Ответ 3
В зависимости от использования, также полезно знать setdiff
и его версию setdiff!
:
julia> setdiff([1,2,3,4], [3])
3-element Array{Int64,1}:
1
2
4
Однако обратите внимание, что он также удаляет все повторяющиеся элементы, как показано в примере:
julia> setdiff!([1,2,3,4, 4], [3])
3-element Array{Int64,1}:
1
2
4
Ответ 4
Несколько других ответов устарели из-за более поздних выпусков Джулии. Я сейчас (Юлия 1.1.0) использую что-то вроде
function remove!(a, item)
deleteat!(a, findall(x->x==item, a))
end
Вы также можете использовать findfirst
если хотите, но он не работает, если a
не содержит item
.