将一个键值对列表扩展为另一个键值对

时间:2013-10-01 14:25:27

标签: erlang

我有两个键值对列表([{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,它合并了两个列表而没有删除重复的重复项。

2 个答案:

答案 0 :(得分:2)

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

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

如果最初未对L1L2进行排序,则可以使用orddict:from_list/1将其转换为orddicts。

答案 1 :(得分: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]).