2016-02-09 14 views
9

Sto vagando da un po 'nei documenti e nei forum e non ho trovato un metodo/funzione incorporato per eseguire il semplice compito di eliminare un elemento in un array. Esiste una funzione così integrata?Elimina elemento in un array per julia

Sto chiedendo l'equivalente di python's list.remove (x).

Ecco un esempio di raccolta ingenuamente una funzione dalla casella:

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) 
    ... 

Here menzioni da usare deleteat!, ma anche non funziona:

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 

risposta

7

Si può anche andare con filter!:

a = Any["D", "A", "s", "t"] 
filter!(e->e≠"s",a) 
println(a) 

dà:

Any["D","A","t"] 

Questo permette di eliminare più valori in una sola volta, come in:

filter!(e->e∉["s","A"],a) 

Nota 1: In Julia 0.5, le funzioni anonime sono molto più veloci e il poco penalizzato in 0.4 non è più un problema :-) .

Nota 2: il codice sopra utilizza operatori unicode. Con operatori normali: è != e e∉[a,b] è !(e in [a,b])

+1

Questa è la soluzione migliore. Ma per me il filtro! non funziona Basta filtrare è abbastanza. Quindi se ho Array b = ["s", "A"] posso usare come filtro (e-> e∉b, a) che funziona alla grande. –

6

deleteat! + findin lo farà:

a = Any["D", "A", "s", "t"] 
deleteat!(a, findin(a, ["s"])) # => ["D", "A", "t"] 

questo è poiché pop! non ha il metodo per eliminare un particolare elemento in una matrice, elimina solo l'ultimo e deleteat! ha bisogno dell'indice dell'elemento che si desidera eliminare. È possibile controllare i metodi che ha una funzione con methods:

methods(pop!) 
methods(deleteat!) 

Per un Dict, è possibile alimentare la chiave dell'elemento da eliminare a delete!.

Problemi correlati