列表到元组转换列表

时间:2011-03-07 01:20:19

标签: erlang

我想将[z,z,a,z,z,a,a,z]转换为[{z,2},{a,1},{z,2},{a,2},{z,1}]。我该怎么办?

所以,我需要积累前一个值,它的计数器和元组列表。

我创建了记录

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

重新定义

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 个答案:

答案 0 :(得分:8)

如果你反过来建立答案(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]).

(我希望现在有人会使用单行列表理解版本。)

答案 1 :(得分:5)

我会继续在反向建立名单的道路上。注意第一行上的X匹配模式。

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

lists:foldr(F,[],List).

答案 2 :(得分:2)

我个人会使用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}].

使用两个累加器可以节省不必要地为列表中的每个元素构建和拆分元组。我发现这样写得更清楚了。