erlang 如何将列表转换为元组列表?

jucafojl  于 2023-09-28  发布在  Erlang
关注(0)|答案(3)|浏览(158)

我想将[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.
iq0todco

iq0todco1#

如果您反向构建答案(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]).
  • (我希望有人现在会遵循一行列表理解版本..)*
fcy6dtqo

fcy6dtqo2#

我将继续在道路上建立反向列表。注意第一行上X上的模式匹配。

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

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

inn6fuwd3#

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

使用两个累加器可以避免为列表中的每个元素构建和分离元组的不必要操作。我觉得这样写更清楚。

相关问题