gpt4 book ai didi

dictionary - Elixir:将列表简化为映射计数发生的次数(模式与另一个参数上的映射键匹配)

转载 作者:行者123 更新时间:2023-12-04 05:16:42 25 4
gpt4 key购买 nike

我有一个可能包含重复项的列表。我想计算列表中每个项目有多少个实例。我的计划是:

list
|> Enum.reduce(%{}, fn
item, %{item => count}=acc -> %{acc | item => count + 1}
item, acc -> Map.put(acc, item, 1)
end)

但是,这无法使用错误 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不能放在守卫中。我在这里发现了很多关于 map 匹配的问题,但是当匹配的值来自另一个参数时,并没有这样做。

最佳答案

修改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}

关于dictionary - Elixir:将列表简化为映射计数发生的次数(模式与另一个参数上的映射键匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43007449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com