Список к списку преобразования кортежей - PullRequest
2 голосов
/ 07 марта 2011

Я хочу конвертировать [z,z,a,z,z,a,a,z] в [{z,2},{a,1},{z,2},{a,2},{z,1}]. Как я могу это сделать?

Итак, мне нужно накопить предыдущее значение, его счетчик и список кортежей.

Я создал запись

-record(acc, {previous, counter, tuples}).

Redefined

listToTuples([]) -> [];
listToTuples([H | Tail]) -> 
    Acc = #acc{previous=H, counter=1},
    listToTuples([Tail], Acc).

Но тогда у меня проблемы ...

listToTuples([H | Tail], Acc) ->   
    case H == Acc#acc.previous of
        true  ->
        false ->
    end.

Ответы [ 3 ]

8 голосов
/ 07 марта 2011

если вы построите свой ответ (Acc) в обратном порядке, предыдущим будет заголовок этого списка.

вот как я бы это сделал -

list_pairs(List) -> list_pairs(List, []).

list_pairs([], Acc) -> lists:reverse(Acc);
list_pairs([H|T], [{H, Count}|Acc]) -> list_pairs(T, [{H, Count+1}|Acc]);
list_pairs([H|T], Acc) -> list_pairs(T, [{H, 1}|Acc]).

(я ожидаю, что кто-то теперь последует с версией понимания списка в одну строку ..)

5 голосов
/ 07 марта 2011

Я бы продолжил строить список в обратном порядке. Обратите внимание на шаблон, соответствующий X в первой строке.

F = fun(X,[{X,N}|Rest]) -> [{X,N+1}|Rest];
       (X,Rest)         -> [{X,1}|Rest] end.

lists:foldr(F,[],List).
2 голосов
/ 08 марта 2011

Я бы лично использовал lists:foldr/3 или сделал бы это вручную с помощью чего-то вроде:

list_to_tuples([H|T]) -> list_to_tuples(T, H, 1);
list_to_tuples([]) -> [].

list_to_tuples([H|T], H, C) -> list_to_tuples(T, H, C+1);
list_to_tuples([H|T], P, C) -> [{P,C}|list_to_tuples(T, H, 1);
list_to_tuples([], P, C) -> [{P,C}].

Использование двух аккумуляторов избавит вас от ненужной сборки и разделения кортежа для каждого элемента в списке.Я нахожу это более понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...