List 如何使用映射实现词典

List 如何使用映射实现词典,list,dictionary,elixir,List,Dictionary,Elixir,我正在尝试实现一个字典,但是Map.put函数没有将新元素添加到映射中,而是为我提供了一个插入了最后一个(key,value}的新映射。我也尝试了Map.put_new,但它不起作用 def someFunction(数组)do dict=%{} 枚举每个(数组,fn项-> 如果(地图上有_键?(命令,项目))做什么 dict=%{dict|item=>(dict[item]+1)} 其他的 dict=Map.put(dict,item,1) 结束 (完) 结束 就像elixir处理变量作用域一

我正在尝试实现一个字典,但是Map.put函数没有将新元素添加到映射中,而是为我提供了一个插入了最后一个(key,value}的新映射。我也尝试了Map.put_new,但它不起作用

def someFunction(数组)do
dict=%{}
枚举每个(数组,fn项->
如果(地图上有_键?(命令,项目))做什么
dict=%{dict|item=>(dict[item]+1)}
其他的
dict=Map.put(dict,item,1)
结束
(完)
结束

就像elixir处理变量作用域一样,您不能从
枚举内部设置
dict
。每个/2
。相反,您需要做的是在枚举
数组时将
dict
作为累加器传递

dict =
  Enum.reduce(array, %{}, fn item, dict ->
    if (Map.has_key?(dict, item)) do
      %{dict | item => (dict[item] + 1)}
    else
      Map.put(dict , item, 1)
    end
  end)
您还可以使用
Map.update/4
改进减速器

dict = Enum.reduce(array, %{}, fn item, dict -> Map.update(dict, item, 1, &(&1 + 1)) end)
但是自从Elixir1.10以来,实际上有一个内置函数


Enum.frequencies/1
,很好。也值得检查。
dict = Enum.frequencies(array)