如何解决Elixir:将列表列表转换为一个列表
假设我们有以下列表:
[[1,2,3,4],[1,4]]
如何将其转换为包含其对应位置上每个元素之和的列表,以便最终结果为
[5,10,15,20]
?
解决方法
不太可能有更简洁的变体可用,但人们可能会避免多次迭代列表并使用递归一次性完成所有事情(并且不涉及元组和转换)。
transpose = fn
[[x | xs] | xss],fun ->
[[x | Enum.map(xss,&hd/1)] | fun.([xs | Enum.map(xss,&tl/1)],fun)]
[[] | xss],fun -> fun.(xss,fun)
[],_ -> []
end
#⇒ #Function<43.97283095/2 in :erl_eval.expr/5>
transpose.(lists,transpose)
#⇒ [[1,1,1],[2,2,2],[3,3,3],[4,4,4]]
lists |> transpose.(transpose) |> Enum.map(&Enum.sum/1)
#⇒ [5,10,15,20]
或者,甚至更简单,避免中间转置:
sum = fn
[[] | _],_ -> []
xs,fun ->
[(xs |> Enum.map(&hd/1) |> Enum.sum()) |
fun.(Enum.map(xs,&tl/1),fun)]
end
sum.(lists,sum)
#⇒ [5,20]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。