问题描述
您好,我想将所有 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}