Dila
Dila

Reputation: 689

How to delete an element from a list in Julia?

v = range(1e10, -1e10, step=-1e8) # velocities [cm/s]
deleteat!(v, findall(x->x==0,v))

I want to delete the value 0 from v. Following this tutorial, I tried deleteat! but I get the error

MethodError: no method matching deleteat!(::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, ::Vector{Int64})

What am I missing here?

Upvotes: 9

Views: 2500

Answers (2)

Przemyslaw Szufel
Przemyslaw Szufel

Reputation: 42214

Use filter! or filter:


julia> filter!(!=(0), [1,0,2,0,4])
3-element Vector{Int64}:
 1
 2
 4

In case of a range you can collect it or use:

julia> filter(!=(0), range(2, -2, step=-1))
4-element Vector{Int64}:
  2
  1
 -1
 -2

However for big ranges you might just not want to materialize them to save the memory footprint. In that case you could use:

(x for x in range(2, -2, step=-1) if x !== 0)

To see what is being generated you need to collect it:

julia> collect(x for x in range(2, -2, step=-1) if x !== 0)
4-element Vector{Int64}:
  2
  1
 -1
 -2

Upvotes: 8

David Scholz
David Scholz

Reputation: 9806

Notice the type that is returned by the function range.

typeof(range(1e10, -1e10, step=-1e8))

The above yields to

StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}

Calling the help function for the function deleteat!.

? deleteat!()

deleteat!(a::Vector, inds)

Remove the items at the indices given by inds, and return the > modified a. Subsequent items are shifted to fill the resulting gap.

inds can be either an iterator or a collection of sorted and > unique integer indices, or a boolean vector of the same length as a with true indicating entries to delete.

We can convert the returned type of range using collect. Try the following code.

v = collect(range(1e10, -1e10, step=-1e8))
deleteat!(v,findall(x->x==0,v))

Notice that we can shorten x->x==0 to iszero which yields to

v = collect(range(1e10, -1e10, step=-1e8))
deleteat!(v,findall(iszero,v))

Upvotes: 5

Related Questions