list - 合并列表 erlang 的内部列表

标签 list merge erlang

我有一个列表L

L = [L1, L2, L3,...]. 

其中 L1、L2、L3.. 本身就是列表,如下所示:

L1 = [{k1, 10}, {k2, 20}, {k3, 30}, {k4, 20.9}, {k6, "Hello world"}]

L2 = [{k1, 90}, {k2, 210}, {k3, 60}, {k4, 66.9}, {k6, "Hello universe"}]

L3 = [...]

现在我想要一个结果组合列表:

FinalList = [
       {k1, [10, 90, ...]}, % '...' denotes values from other lists
       {k2, [20, 210, ...]},
       {K3, [30, 60, ...]},
       {k4, [20.9, 66.9, ...]},
       {K6, ["Hello world", "Hello universe", ...]}
     ]

我可以使用我的 Old Posts Solutions:Combine/Merge Two Erlang lists 进行合并但我不确定如何将 L(列表的列表)传递给该合并函数。

提前致谢!

最佳答案

您可以使用 lists:foldlmerge 应用于列表列表。这是一个例子:

-module(test).
-export([test/0]).


merge(L1, L2) ->
    merge_(lists:sort(L1), lists:sort(L2)).

merge_([{K, V1}|T1], [{K, V2}|T2]) when is_list(V1), is_list(V2)
    -> [{K, V1 ++ V2}|merge_(T1, T2)]; 
merge_([{K, V1}|T1], [{K, V2}|T2]) when is_list(V1)
    -> [{K, V1 ++ [V2]}|merge_(T1, T2)];
merge_([{K, V1}|T1], [{K, V2}|T2]) when is_list(V2)
    -> [{K, [V1] ++ V2}|merge_(T1, T2)];
merge_([{K, V1}|T1], [{K, V2}|T2]) 
    -> [{K, [V1, V2]}|merge_(T1, T2)];
merge_([{K1, V1}|T1], [{K2, _}|_]=L2) when K1 < K2 
   -> [{K1, [V1]}|merge_(T1, L2)];
merge_(L1, [{K2, V2}|T2]) when is_list(V2)
   -> [{K2, V2}|merge_(L1, T2)];
merge_(L1, [{K2, V2}|T2]) 
   -> [{K2, [V2]}|merge_(L1, T2)];
merge_(L1, []) -> [{K, V} || {K, V} <- L1].


test() ->

  L1 = [{k1, 10}, {k2, 20}, {k3, 30}, {k4, 20.9}, {k6, "Hello world"}],
  L2 = [{k1, 90}, {k2, 210}, {k3, 60}, {k4, 66.9}, {k6, "Hello universe"}],
  L3 = [{k1, 45}, {k2, 35}, {k3, 37}, {k4, 77.9}, {k6, "Hello cosmo"}],
  lists:foldl(fun merge/2, [], [L1, L2, L3]).

结果如下:

36> test:test().
[{k1,"-Z\n"},
 {k2,[35,210,20]},
 {k3,[37,60,30]},
 {k4,[77.9,66.9,20.9]},
 {k6,"Hello cosmoHello universeHello world"}]

如你所见,

  1. 您需要修改 merge 函数来处理列表(而不仅仅是原始问题中的原子)。它已经在我的示例代码中完成,它基于 Vychodil's answer .

  2. 您需要修改 merge 函数以正确处理字符串(作为键 k1 和 k6 中的证据)。您应该能够自己修复它。

最后但同样重要的是,当答案解决了您的问题时,您应该接受它。检查this link为什么。

关于list - 合并列表 erlang 的内部列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21876507/

相关文章:

python - 在 python 中查找 'large' 列表的 min()/max()。值错误 : min() arg is an empty sequence

python - 使用基于列表列表中的项目的键创建 Python 字典

swift - ARKit 2.0 – 如何在两个 ARWorldMap 中组合 ARAnchors?

r - 将两个数据框合并为一个,其中条目被串联

debugging - 使用 -compile 在 Erlang 模块中请求 debug_info

ruby - 删除元素时,Ruby 数组的内部行为如何?

python - 在 Python 中基于一个属性合并两个嵌套列表

git - 有没有编写自定义 git merge 策略的文档?

c - 如何编译 Erlang 驱动程序?

sockets - 二郎 get_tcp :recv data length