首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列表中返回分组和

从列表中返回分组和
EN

Code Review用户
提问于 2015-09-28 04:40:20
回答 1查看 911关注 0票数 4

我刚开始服用药剂,这就是我现在所拥有的。有什么更简单或者更好的方法来写这个吗?

代码语言:javascript
复制
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}
EN

回答 1

Code Review用户

发布于 2015-12-20 06:29:58

它可以用几种方法来完成。我们可以使用Enum模块的递归功能,而不是像@alxndr建议的那样显式地使用递归。我将使用Enum.map_reduce,因为我发现在故障排除以该形式键入项和累加器时很有用。

一般来说,解决办法和你的一样。

代码语言:javascript
复制
  def sum(list) do
    list |> Enum.map_reduce([],
      fn({key, val}, acc) ->
        {{key, val}, Keyword.update(acc, key, val, &(&1 + val))}
      end
    ) |> elem(1)
  end

map_reduce中的anonmous函数接受和项以及累加器。因为条目是关键字列表,所以它有表单{key,val},所以我在函数定义中匹配它。此函数的返回必须是以累加器作为第二个值的元组。出于测试目的,我返回了与第一项相同的{key, val}。Keyword.update函数是累加器。帮助中间值可见的同一例程的一种形式是:

代码语言:javascript
复制
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帮助我理解例程如何收集所需的结果,如下所示。

代码语言:javascript
复制
[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]

我发现这是一个有趣的练习--谢谢你的发帖。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/105881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档