2016-02-09 14 views
9

Wędruję przez chwilę w dokumentach i na forach i nie znalazłem wbudowanej metody/funkcji, aby wykonać proste zadanie usunięcia elementu w tablicy. Czy istnieje taka wbudowana funkcja?Usuń element w tablicy dla julia

Proszę o odpowiednik listy python.remove (x).

Oto przykład naiwnie zbieranie funkcję z pudełka:

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 wspomina używać deleteat!, ale też nie działa:

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 

Odpowiedz

7

Można też przejść z filter!:

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

daje:

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

Pozwala usunąć kilka wartości naraz, na przykład:

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

Uwaga 1: W Julia 0.5, anonimowe funkcje są znacznie szybsze, a mała kara w 0.4 nie jest już problemem :-) .

Uwaga 2: Powyższy kod używa operatorów kodu Unicode. Z normalnymi operatorami: jest != i e∉[a,b] jest !(e in [a,b])

+1

To jest najlepsze rozwiązanie. Ale dla mnie filtr! nie działa. Wystarczy filtr. Więc jeśli mam Array b = ["s", "A"] mogę użyć jako tego filtra (e-> e∉b, a), który działa świetnie. –

6

deleteat! + findin to zrobi:

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

to jest ponieważ pop! nie ma metody eliminacji konkretnego elementu w Tablicy, eliminuje tylko ostatni, a deleteat! potrzebuje indeksu elementu, który chcesz wyeliminować. Można sprawdzić, że funkcja metody ma z methods:

methods(pop!) 
methods(deleteat!) 

Dla Dict, można karmić klucz elementu eliminacji do delete!.