Erlang список манипуляций - PullRequest
       5

Erlang список манипуляций

3 голосов
/ 02 ноября 2009

У меня есть список кортежей:

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]]

это кажется довольно простой проблемой, но я не могу понять, как это сделать. Пожалуйста, помогите!

Ответы [ 3 ]

5 голосов
/ 02 ноября 2009

Посмотрим ...

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).

2 голосов
/ 02 ноября 2009

Для вашего конкретного примера вы можете определить следующую функцию:

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))).

Надеюсь, этого достаточно, чтобы дать вам общую стратегию.

1 голос
/ 02 ноября 2009
-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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...