如何总结 Elixir 地图列表中不同键的值
How to sum up values of different keys in a list of maps in Elixir
你好,我想将所有 count 和所有 val 键汇总到一个包含两个键的累积值的新映射.
这是我目前所做的:
list = [
%{count: 1, val: 12},
%{count: 3, val: 7},
%{count: 1, val: 5},
%{count: 2, val: 3},
%{count: 2, val: 5},
%{count: 1, 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}
我只知道一键总结。我应该在两个函数中分别总结键吗?我认为那不是高效的,考虑到列表将有更多 values/maps 或者可能更多的键。
有没有一种有效的方法可以一次总结所有的键?
我想这就是您要找的东西?
Enum.reduce(list, %{count: 0, val: 0}, fn %{count: count, val: val}, acc ->
%{count: acc.count + count, val: acc.val + val}
end)
您可以使用Enum.reduce/2
,因为您的列表元素和累加值的格式相同。诀窍是使用整个映射 %{count: count, val: val}
作为累加器,而不仅仅是一个整数:
Enum.reduce(list, fn item, acc ->
%{count: item.count + acc.count, val: item.val + acc.val}
end)
我会将初始列表减少 Map.merge/3
Enum.reduce(list, &Map.merge(&1, &2, fn _, v1, v2 -> v1 + v2 end))
#⇒ %{count: 10, val: 35}
你好,我想将所有 count 和所有 val 键汇总到一个包含两个键的累积值的新映射.
这是我目前所做的:
list = [
%{count: 1, val: 12},
%{count: 3, val: 7},
%{count: 1, val: 5},
%{count: 2, val: 3},
%{count: 2, val: 5},
%{count: 1, 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}
我只知道一键总结。我应该在两个函数中分别总结键吗?我认为那不是高效的,考虑到列表将有更多 values/maps 或者可能更多的键。 有没有一种有效的方法可以一次总结所有的键?
我想这就是您要找的东西?
Enum.reduce(list, %{count: 0, val: 0}, fn %{count: count, val: val}, acc ->
%{count: acc.count + count, val: acc.val + val}
end)
您可以使用Enum.reduce/2
,因为您的列表元素和累加值的格式相同。诀窍是使用整个映射 %{count: count, val: val}
作为累加器,而不仅仅是一个整数:
Enum.reduce(list, fn item, acc ->
%{count: item.count + acc.count, val: item.val + acc.val}
end)
我会将初始列表减少 Map.merge/3
Enum.reduce(list, &Map.merge(&1, &2, fn _, v1, v2 -> v1 + v2 end))
#⇒ %{count: 10, val: 35}