Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 按二维分组并在长生不老药中计数_Elixir_Reduce - Fatal编程技术网

Elixir 按二维分组并在长生不老药中计数

Elixir 按二维分组并在长生不老药中计数,elixir,reduce,Elixir,Reduce,我在看两个维度的分组,然后计算每个类别/子类别中每个元素的数量 数据=[ %{品牌:“梅赛德斯”,颜色:“蓝色”}, %{品牌:“梅赛德斯”,颜色:“蓝色”}, %{品牌:“宝马”,颜色:“蓝色”}, %{品牌:“宝马”,颜色:“蓝色”}, %{品牌:“宝马”,颜色:“蓝色”}, %{品牌:“Lada”,颜色:“蓝色”}, %{品牌:“梅赛德斯”,颜色:“红色”}, %{品牌:“梅赛德斯”,颜色:“红色”}, %{品牌:“梅赛德斯”,颜色:“红色”}, %{品牌:“梅赛德斯”,颜色:“红色”},

我在看两个维度的分组,然后计算每个类别/子类别中每个元素的数量

数据=[
%{品牌:“梅赛德斯”,颜色:“蓝色”},
%{品牌:“梅赛德斯”,颜色:“蓝色”},
%{品牌:“宝马”,颜色:“蓝色”},
%{品牌:“宝马”,颜色:“蓝色”},
%{品牌:“宝马”,颜色:“蓝色”},
%{品牌:“Lada”,颜色:“蓝色”},
%{品牌:“梅赛德斯”,颜色:“红色”},
%{品牌:“梅赛德斯”,颜色:“红色”},
%{品牌:“梅赛德斯”,颜色:“红色”},
%{品牌:“梅赛德斯”,颜色:“红色”},
%{品牌:“宝马”,颜色:“黑色”}
]
预期结果:

[
%{“梅赛德斯”:[“蓝色”:2,“红色”:4]},
%{“Lada”:[“蓝色”:1]},
%{“宝马”:[“蓝色”:3,“黑色”:1]}
]
我有一些与结果很接近的东西,但这并不是我想要的:

per_brands=Enum.group_by(数据,fn(项目)->[item[:brand]]end)
枚举映射(
per_品牌,
fn(每个品牌的汽车)->
%{
“{elem(汽车品牌,0)}”:(
枚举映射(
枚举分组依据(元素(每个品牌的汽车,1),fn(汽车)->汽车[:颜色]结束),
fn(汽车、品牌、颜色)->
%{“{elem(cars_peru_brands_peru colors,0)}”:枚举计数(elem(cars_peru brands_peru colors,1))}
结束
))
}
结束
)
#结果:(不完全是我想要的)
[
%{BMW:[%{黑色:1},%{蓝色:3}]},
%{Lada:[%{blue:1}]},
%{梅赛德斯:[%{蓝色:2},%{红色:4}]}
]

我相信使用reduce/3可以做一些更聪明、更好的事情,但我不能掉以轻心。

你可以用reduce这样做:

Enum.reduce(数据,%{},fn%{brand:brand,color:color},acc->
colors=Map.get(acc,brand,%{})|>Map.update(color,1,&(&1+1))
地图放置(acc、品牌、颜色)
(完)
对于每个品牌/颜色对,建立一张地图,在找到地图时增加颜色计数

结果:

%{
“宝马”=>%{“黑色”=>1,“蓝色”=>3},
'Lada'=>%{'blue'=>1},
“梅赛德斯”=>%{“蓝色”=>2,“红色”=>4}
}

我设法用
地图比我最初的方法做得更好。减少
访问。按键/2

Enum.reduce(
数据,
%{},
fn(项目,附件)->
新值=如果(根据[项目[:品牌]][项目[:颜色]])执行
#该值已存在
acc[项目[:品牌]][项目[:颜色]]+1
其他的
#该值不存在,请初始化为1
1.
结束
acc=put_in(acc,[Access.key(项目[:品牌],%{}),项目[:颜色]],新的_值)
结束
)

我认为@adam解决方案更整洁

这很整洁,谢谢。最后,我使用了另一种使用Reduce的方法,即使用
Access.key
方法。这一点很难理解,但最终还是奏效了。