web-dev-qa-db-fra.com

Supprimer un élément dans un tableau pour julia

J'ai erré pendant un moment dans la documentation et les forums et je n'ai pas trouvé de méthode/fonction intégrée permettant de supprimer un élément d'un tableau. Existe-t-il une telle fonction intégrée?

Je demande l'équivalent de list.remove de python (x).

Voici un exemple de sélection naïve d'une fonction de la boîte:

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 mentionne l'utilisation de deleteat!, mais ne fonctionne pas non plus:

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
14
user2820579

Vous pouvez aussi aller avec filter!:

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

donne:

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

Cela permet de supprimer plusieurs valeurs à la fois, comme dans:

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

Note 1: Dans Julia 0.5, les fonctions anonymes sont beaucoup plus rapides et le peu de pénalité ressentie dans 0.4 n’est plus un problème :-).

Note 2: Le code ci-dessus utilise des opérateurs Unicode. Avec des opérateurs normaux: est != et e∉[a,b] est !(e in [a,b])

9
Dan Getz

deleteat! + findin le fera:

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

c'est parce que pop! n'a pas de méthode pour éliminer un élément particulier dans un tableau, il n'élimine que le dernier et deleteat! a besoin de l'index de l'élément que vous voulez éliminer. Vous pouvez vérifier les méthodes d'une fonction avec methods:

methods(pop!)
methods(deleteat!)

Pour un Dict, vous pouvez alimenter la clé de l'élément à éliminer en delete!.

10
amrods

En fonction de l'utilisation, il est également bon de connaître setdiff et sa version sur place setdiff!:

Julia> setdiff([1,2,3,4], [3])
3-element Array{Int64,1}:
 1
 2
 4

Toutefois, notez qu'il supprime également tous les éléments répétés, comme illustré dans l'exemple:

Julia> setdiff!([1,2,3,4, 4], [3])
3-element Array{Int64,1}:
 1
 2
 4
1
张实唯