1

我有两个键值对列表 ( [{key_1, value_1}, ..., {key_n, value_n}])。用第二个更新第一个列表的最佳方法是什么?例如:

1> extend([{1, "one"}, {2, "too"}], [{2, "two"}, {3, "three"}]).
[{1, "one"}, {2, "two"}, {3, "three"}]

我只发现了两个类似的函数:lists:keystore/4,它更新单个元组,以及lists:keymerge,它合并两个列表而不删除重复的键。

4

2 回答 2

2

我自己找到了答案。Erlang 的orddict模块处理对的纯排序列表{key, value}。因此,extend函数可以定义如下:

extend(L1, L2) ->
    orddict:merge(fun(_Key, _V1, V2) -> V2 end, L1, L2).

如果L1并且L2最初没有排序,则可以将它们转换为带有orddict:from_list/1.

于 2013-10-01T15:30:03.023 回答
0

例如

extend(L1,L2) -> 
    lists:foldl(fun({K,V},Acc) -> lists:keystore(K,1,Acc,{K,V}) end, L1,L2).

或者

extend(L1,L2) ->
    compact(lists:keysort(1,L1++L2),[]).

compact([],Acc) -> lists:reverse(Acc);
compact([{K,_},{K,V}| Rest], Acc) -> compact([{K,V} |Rest],Acc);
compact([X|Rest],Acc) -> compact(Rest,[X|Acc]).
于 2013-10-02T07:25:31.487 回答