erlang列表操作

Qui*_*ncy 3 erlang list

我有一个元组列表:

L = [{1, [a, b, c]}, {2, [d, e, f]}, {3, [[h, i, j], [k, l, m]]}]
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的

lists:map(fun({_, B}-> B end, L).
Run Code Online (Sandbox Code Playgroud)

输出是

[[a, b, c], [d, e, f], [[h, i, j], [k, l, m]]]
Run Code Online (Sandbox Code Playgroud)

我想要的是:

[[a, b, c], [d, e, f], [h, i, j], [k, l, m]]
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常容易的问题,但我无法弄清楚如何做到这一点.请帮忙!

ndi*_*dim 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]]}]
Run Code Online (Sandbox Code Playgroud)

琐碎而直截了当,但不是尾递归的:

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]]
Run Code Online (Sandbox Code Playgroud)

不是尾递归并不是很好,但是......

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]]
Run Code Online (Sandbox Code Playgroud)

...尾递归版本也有效(感谢Zed指出lists:reverse/2).

  • @ndim:lists:reverse(E,A)=:= lists:append(lists:reverse(E),A) (3认同)