List Zip 3将列表压缩为元组-Erlang

List Zip 3将列表压缩为元组-Erlang,list,erlang,zip,tuples,List,Erlang,Zip,Tuples,有没有一种优化的方法可以按顺序压缩3个列表 zip(L1, L2, L3) 因此,它们会产生一个元组列表,例如: L1 = [1, 2, 3, 4], L2 = [a, b, c, d], L3 = [1, 2, 3, 4], 元组的结果列表应如下所示: [{1,a,1}, {2,b,2}, {3,c,3}, {4,d,4}] 似乎您需要使用: 或者,您可以手动实现它: myzip3([], _, _) -> []; myzip3([X|Xs], [Y|Ys], [Z|Zs])

有没有一种优化的方法可以按顺序压缩3个列表

zip(L1, L2, L3)
因此,它们会产生一个元组列表,例如:

L1 = [1, 2, 3, 4],
L2 = [a, b, c, d],
L3 = [1, 2, 3, 4],
元组的结果列表应如下所示:

[{1,a,1}, {2,b,2}, {3,c,3}, {4,d,4}]
似乎您需要使用:

或者,您可以手动实现它:

myzip3([], _, _) ->
  [];
myzip3([X|Xs], [Y|Ys], [Z|Zs]) ->
  [{X,Y,Z}|myzip3(Xs,Ys,Zs)].
或使用蓄能器:

myzip3acc(Xs, Ys, Zs) ->
  myzip3acc_do([], Xs, Ys, Zs).

myzip3acc_do(Acc, [], _, _) ->
  lists:reverse(Acc);
myzip3acc_do(Acc, [X|Xs], [Y|Ys], [Z|Zs]) ->
  myzip3acc_do([{X,Y,Z}|Acc], Xs,Ys,Zs).
在:

测试:


请注意,在较新的Erlang版本中,适当的优化
myzip3acc/3
并不一定比
myzip3/3
快。
myzip3([], _, _) ->
  [];
myzip3([X|Xs], [Y|Ys], [Z|Zs]) ->
  [{X,Y,Z}|myzip3(Xs,Ys,Zs)].
myzip3acc(Xs, Ys, Zs) ->
  myzip3acc_do([], Xs, Ys, Zs).

myzip3acc_do(Acc, [], _, _) ->
  lists:reverse(Acc);
myzip3acc_do(Acc, [X|Xs], [Y|Ys], [Z|Zs]) ->
  myzip3acc_do([{X,Y,Z}|Acc], Xs,Ys,Zs).
zip3_cps([X|Xs], [Y|Ys], [Z|Zs], F) ->
     zip3_cps(Xs, Ys, Zs, fun(L) -> F([{X,Y,Z}|L]) end);
zip3_cps([], _, _, F) ->
     F([]).
1> cps:zip3_cps([1,2,3], [4,5,6], [7,8,9], fun(X) -> X end).
[{1,4,7},{2,5,8},{3,6,9}]