我有一个元组列表:
L = [{1, [a, b, c]}, {2, [d, e, f]}, {3, [[h, i, j], [k, l, m]]}]
这就是我所拥有的
lists:map(fun({_, B}-> B end, L).
输出
[[a, b, c], [d, e, f], [[h, i, j], [k, l, m]]]
我想要的是:
[[a, b, c], [d, e, f], [h, i, j], [k, l, m]]
这似乎是一个非常简单的问题,但我无法弄清楚如何做到这一点。 请帮忙!
答案 0 :(得分:5)
让我们看看......
1> L = [{1, [a, b, c]}, {2, [d, e, f]}, {3, [[h, i, j], [k, l, m]]}].
[{1,[a,b,c]},{2,[d,e,f]},{3,[[h,i,j],[k,l,m]]}]
琐碎而直截了当,但不是尾递归:
2> lists:foldr(fun ({_,[X|_]=E},A) when is_list(X) -> lists:append(A,E);
({_,E},A) -> [E|A] end,
[], L).
[[a,b,c],[d,e,f],[h,i,j],[k,l,m]]
不是尾递归并不是很好,但是......
3> lists:reverse(lists:foldl(fun ({_,[X|_]=E},A) when is_list(X) ->
lists:reverse(E,A);
({_,E},A) -> [E|A] end,
[], L)).
[[a,b,c],[d,e,f],[h,i,j],[k,l,m]]
...尾递归版本也有效(感谢Zed指出lists:reverse/2
)。
答案 1 :(得分:2)
对于您的特定示例案例,您可以定义以下函数:
group3([], Acc) ->
Acc;
group3([A,B,C|Tl], Acc) ->
group3(Tl, [[A,B,C]] ++ Acc).
group3(L) ->
lists:reverse(group3(L, [])).
并像这样调用它:
group3(lists:flatten(lists:map(fun({_, B}) -> B end, L))).
希望这足以为您提供一般策略。
答案 2 :(得分:1)
-module(z).
-export([do/1]).
do([{_,[X|_] = L}|Tl]) when is_list(X) -> L ++ do(Tl);
do([{_, L} |Tl]) -> [L|do(Tl)];
do([]) -> [].
测试:
1> z:do(L).
[[a,b,c],[d,e,f],[h,i,j],[k,l,m]]