我经常想把一个列表中的每个元素都放到一个现有的列表中。
MyList = [3,2,1],
MyNewElements = [4,5,6],
MyNewList = lists:foldl(fun(A, B) -> [A | B] end, MyList, MyNewElements).
%% [6,5,4,3,2,1]
假设MyList
有1M个元素,而MyNewElements
只有几个元素,我想有效地做到这一点。
我不知道这些函数中的哪个-如果有的话-做了我想做的事情:https://www.erlang.org/doc/man/lists.html
将短列表添加到长列表的开头是便宜的-++
操作符的执行时间与第一个列表的长度成正比。复制第一个列表,不加修改地将第二个列表添加为尾部。
在你的例子中,就是:
lists:reverse(MyNewElements) ++ MyList
(lists:reverse/1
的执行时间也与参数的长度成正比)
除了已经提供的选项外,还可以使用
NewDeepList = [MyList | DeepList]
和修改读取/遍历,以能够处理[[element()]]
而不是[element()]
。
因为erlang是函数式语言,不同于c、javascript,它是复制变量并修改它,而不仅仅是修改它。因此不可能压缩到0 (A).length(A)是新添加元素的长度。