给定一个列表和一个整数,我想将该列表拆分为指定数量的列表(在列表中)。
例如:
输入:
d3.select(dom).append('svg')
输出:
[1,2,3,4,5,6,7,8,9], 3
什么是干净有效的方法?
答案 0 :(得分:3)
您可以使用lists:split/2
:
divide(L, N) ->
divide(L, N, []).
divide([], _, Acc) ->
lists:reverse(Acc);
divide(L, N, Acc) when length(L) < N ->
lists:reverse([L|Acc]);
divide(L, N, Acc) ->
{H,T} = lists:split(N, L),
divide(T, N, [H|Acc]).
第一个函数divide/2
用作入口点。它只是使用空列表的初始累加器值调用辅助函数divide/3
,然后divide/3
完成所有工作。 divide/3
的第一个子句在列表完全处理后匹配,因此它只是反转累加器并返回该值。第二个子句处理L
的长度小于请求的N
值的情况;它通过在Acc
前加L
然后返回新累加器的反向来创建一个新的累加器。第三个子句首先调用lists:split/2
将传入列表拆分为H
(N
元素列表)和T
(列表的其余部分)。然后它以递归方式调用自身,将T
作为新列表值,原始N
值和由H
组成的新累加器作为第一个元素和原始累加器{{1作为尾巴。