我刚开始服用药剂,这就是我现在所拥有的。有什么更简单或者更好的方法来写这个吗?
defmodule GroupBySum do
def sum(col), do: sum(%{}, col)
defp sum(r, [h|t]) do
{k, v} = h
r = r |> Dict.update(k, v, fn(val) -> val + v end)
sum(r, t)
end
defp sum(r, []), do: r
end
list = [a: 1, b: 2, c: 3, a: 2, b: 1, c: 0]
IO.inspect GroupBySum.sum(list) #%{a: 3, b: 3, c: 3}发布于 2015-12-20 06:29:58
它可以用几种方法来完成。我们可以使用Enum模块的递归功能,而不是像@alxndr建议的那样显式地使用递归。我将使用Enum.map_reduce,因为我发现在故障排除以该形式键入项和累加器时很有用。
一般来说,解决办法和你的一样。
def sum(list) do
list |> Enum.map_reduce([],
fn({key, val}, acc) ->
{{key, val}, Keyword.update(acc, key, val, &(&1 + val))}
end
) |> elem(1)
endmap_reduce中的anonmous函数接受和项以及累加器。因为条目是关键字列表,所以它有表单{key,val},所以我在函数定义中匹配它。此函数的返回必须是以累加器作为第二个值的元组。出于测试目的,我返回了与第一项相同的{key, val}。Keyword.update函数是累加器。帮助中间值可见的同一例程的一种形式是:
def sum(list) do
list |> Enum.map_reduce([],
fn({key, val}, acc) ->
x = Keyword.update(acc, key, val, &(&1 + val))}
IO.inspect(x)
{{key, val}, x}
end
) |> elem(1)
end对于您提供的输入,IO.inspect帮助我理解例程如何收集所需的结果,如下所示。
[a: 1]
[a: 1, b: 2]
[a: 1, b: 2, c: 3]
[a: 3, b: 2, c: 3]
[a: 3, b: 3, c: 3]
[a: 3, b: 3, c: 3]
[a: 3, b: 3, c: 3]我发现这是一个有趣的练习--谢谢你的发帖。
https://codereview.stackexchange.com/questions/105881
复制相似问题