Подтвердить что ты не робот

Удалить элемент в массиве для 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
4b9b3361

Ответ 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.