提问人:Alice 提问时间:11/15/2023 最后编辑:Adam MillerchipAlice 更新时间:11/17/2023 访问量:64
满足条件时,长生不老药计数出现次数
Elixir count number of occurences when condition is satisfied
问:
我尝试在 Elixir 中做以下可以在 Python 中实现的事情:
sum = 0
for elem in list:
if elem >= 5:
sum += 1
例如:我想返回给定列表的数字3
[0, 5, 8, 3, 10]
这是我在 Elixir 中所做的(这还没有工作):
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
我收到以下错误:** (ArithmeticError) bad argument in arithmetic expression: nil + 1
编辑:
找到了!
问题是当 x < 5 时我没有返回任何值,导致没有传递给 因此是 。以下代码有效:acc
acc
nil
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
答:
5赞
zwippie
11/15/2023
#1
在reduce函数中,您忘记告诉数字为5或更少时该怎么做:
list = [0, 5, 8, 3, 10]
Enum.reduce(list, 0, fn num, acc -> if num >= 5, do: acc + 1, else: acc end)
使用 Enum.count/2
甚至更简单:
Enum.count(list, & &1 >= 5)
0赞
Onorio Catenacci
11/17/2023
#2
为了完整起见,这也可以通过折叠函数来完成。喜欢这个:
list = [0, 5, 8, 3, 10]
List.foldl(list, 0, fn num, acc -> if num >=5, do: acc+1, else: acc end)
通常,折叠用于列表的某种类型的求和,例如:
List.foldl(list, 0, fn num, acc -> num + acc end)
# 26
或
List.foldl(["a","b","c"], "", fn char, string -> string <> char end)
# "abc"
但事实并非如此。我不记得 reduce 是否被认为是折叠的更一般形式,或者相反。正如我所说,为了完整起见,我发布这个。
0赞
Adam Millerchip
11/17/2023
#3
Enum.count/2
是首选解决方案:
Enum.count(list, fn elem -> elem >= 5 end)
您也可以在不使用任何模块的情况下使用理解来做到这一点:
for elem <- list, elem >= 5, reduce: 0 do
acc -> acc + 1
end
或者使用递归:
def count([]), do: 0
def count([elem | rest]) when elem >= 5, do: 1 + count(rest)
def count([_elem | rest]), do: count(rest)
上一个:Ada 访客设计模式和泛型
评论