enumselixir

Elixir count number of occurences when condition is satisfied

I try to do the following thing in Elixir that can be achieved in Python:

``````sum = 0
for elem in list:
if elem >= 5:
sum += 1
``````

For example: I want to return the number `3` given the list `[0, 5, 8, 3, 10]`

This is what I did in Elixir (this is not working yet):

``````    cond do
Enum.empty?(list) -> 0
length(list) == 1 -> if List.first(list) >= 5 do 1 else 0 end
true ->
Enum.reduce(list, 0, fn x, acc -> if x >= 5 do acc + 1 end end)
end
end
``````

I get the following error: `** (ArithmeticError) bad argument in arithmetic expression: nil + 1`

Edit:

Found it! The problem was that I didn't return any value when x < 5, resulting of no value passed to `acc` therefore `acc` was `nil`. This code below works:

``````cond do
Enum.empty?(list) -> 0
length(list) == 1 -> if List.first(list) >= 5 do 1 else 0 end
true ->
Enum.reduce(list, 0, fn x, acc -> if x >= 5 do acc + 1 else acc + 0 end end)
end
end
``````

Solution

• In the reduce function, you forgot to tell what to do when the number is 5 or less:

``````list = [0, 5, 8, 3, 10]
Enum.reduce(list, 0, fn num, acc -> if num >= 5, do: acc + 1, else: acc end)
``````

And even simpler with `Enum.count/2`:

``````Enum.count(list, & &1 >= 5)
``````