Dav*_*man 8 dictionary count elixir duplicates pattern-matching
我有一个可能包含重复的列表.我想计算列表中每个项目的实例数.我的计划是:
list
|> Enum.reduce(%{}, fn
item, %{item => count}=acc -> %{acc | item => count + 1}
item, acc -> Map.put(acc, item, 1)
end)
Run Code Online (Sandbox Code Playgroud)
但是,这无法编译错误illegal use of variable item inside map key match, maps can only match on existing variable by using ^item.
所以我改变了第一个模式item, %{^item => count}=acc.那时,错误就变成了unbound variable ^item.
我不知道该怎么做.我知道可以基于另一个模式匹配一个参数(比如fn a, a -> true一个比较函数的头部),但显然不是这种情况.我试着用守卫做这件事但Map.has_key?/2不能戴卫兵.我在这里找到了很多关于在地图上匹配的问题,但是当匹配的值来自另一个参数时,我没有这么做.
Dog*_*ert 18
修改Map中键的值并插入(如果它尚不存在)正是Map.update/4如此.要计算频率,默认1值为,更新fn只会将值加1(&(&1 + 1)):
iex(1)> [1, 2, :a, 2, :a, :b, :a] |>
...(1)> Enum.reduce(%{}, fn x, acc -> Map.update(acc, x, 1, &(&1 + 1)) end)
%{1 => 1, 2 => 2, :a => 3, :b => 1}
Run Code Online (Sandbox Code Playgroud)