满足条件时,长生不老药计数出现次数

Elixir count number of occurences when condition is satisfied

提问人:Alice 提问时间:11/15/2023 最后编辑:Adam MillerchipAlice 更新时间:11/17/2023 访问量:64

问:

我尝试在 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 时我没有返回任何值,导致没有传递给 因此是 。以下代码有效:accaccnil

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)