如何在Elixir中的地图列表中汇总不同键的值

问题描述

您好,我想将所有 count 和所有 val 键汇总到一个包含两个键的累加值的新映射中。

这是我到目前为止所做的:

list = [
  %{count: 1,val: 12},%{count: 3,val: 7},%{count: 1,val: 5},%{count: 2,val: 3},val: 3}
]

x = &%{count: &1,val: &1}
sumCount = list |> Enum.reduce(0,&(&1.count + &2)) |> x.() |> IO.inspect()

我得到这个结果:

#ouput: 
%{count: 10,val: 10}

但是我需要这个结果:

%{count: 10,val: 35}

我只知道如何总结一把钥匙。我应该在两个功能中分别总结按键吗?我认为那不是性能,考虑到该列表将具有更多的值/映射或更多的键。 有一种有效的方法可以一次汇总所有密钥吗?

解决方法

您可以使用Enum.reduce/2,因为列表元素和累积值的格式相同。诀窍是使用整个映射%{count: count,val: val}作为累加器,而不仅仅是一个整数:

Enum.reduce(list,fn item,acc ->
  %{count: item.count + acc.count,val: item.val + acc.val}
end)
,

我认为这就是您想要的?

Enum.reduce(list,%{count: 0,val: 0},fn %{count: count,val: val},acc ->
  %{count: acc.count + count,val: acc.val + val}
end)
,

我想将初始列表减少Map.merge/3

Enum.reduce(list,&Map.merge(&1,&2,fn _,v1,v2 -> v1 + v2 end))
#⇒ %{count: 10,val: 35}