我有两个键值对列表([{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
,它合并了两个列表而没有删除重复的重复项。
答案 0 :(得分: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
将其转换为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]).