How to combine tuple lists in erlang? I have lists:
L1 = [{k1, 10}, {k2, 20}, {k3, 30}, {k4, 20.9}, {k6, "Hello world"}],
and
L2 = [{k1, 90}, {k2, 210}, {k3, 60}, {k4, 66.9}, {k6, "Hello universe"}],
now I want a combined list as :
L3 = [
{k1, [10, 90]},
{k2, [20, 210]},
{K3, [30, 60]},
{k4, [20.9, 66.9]},
{K6, ["Hello world", "Hello universe"]}
].
6条答案
按热度按时间wz1wpwve1#
有一个很好的解决方案,使用Erlang标准库中的
sofs
模块。sofs
模块描述了一个处理数学集合的DSL。这是其中一种情况,你可以通过将数据转换到SOFS世界中来利用它,在这个世界中操作它们,然后再将它们转换回外部。请注意,我确实对L3做了一些更改,因为
sofs
不保留字符串顺序。ebdffaop2#
一些更短的,列表甚至不必拥有相同的键,并且可以无序:
Fun可以直接写在
lists:map/2
函数中,但这使它可读。输出,包含示例中的数据:
"\nZ"
是因为Erlang将[10,90]解释为字符串(实际上是列表)。wmtdaxz33#
这种技术称为合并连接,在数据库设计中是众所周知的。
如果在两个列表中可以有不同的键集,并且您希望删除那些可以使用的值
或者,如果您希望将这些值存储在列表中
当然,如果你不介意结果顺序相反,你可以使用尾递归版本,或者你可以一直使用
lists:reverse/1
或者
或者
如果列表中有一个可能包含相同的键,并且您希望收集所有值,则可以考虑这样做
64jmpszr4#
lists:zipwith/2
怎么了?假设条件:
lists:zipwith(fun({X, Y}, {X, Z}) -> {X, [Y, Z]} end, L1, L2).
6yoyoihd5#
也许这不是最好的方法,但它确实达到了你想要达到的目的。
编辑我假设输入列表的顺序与示例输入相同。如果不是,您可以在合并前使用
lists:sort/2
对其进行排序。7gs2gvoe6#
您可以使用列表解析:
输出量: