2011-01-28 29 views
2

是否有拉鍊3只列出了最優化的方式,爲了郵編3列出成Tuple-二郎

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}] 

回答

6
1> lists:zip3([1,2,3,4],[a,b,c,d],[1,2,3,4]). 
[{1,a,1},{2,b,2},{3,c,3},{4,d,4}] 
2> 

或者你可以手動實現:

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). 
+0

注意的是,由於優化`myzip3acc/3`不一定快於`myzip3/3`在新版本的二郎神。 – 2011-01-28 13:18:34

10

看來你需要使用lists:zip3/3

1> L1 = [1, 2, 3, 4]. 
[1,2,3,4] 
2> L2 = [a, b, c, d]. 
[a,b,c,d] 
3> L3 = [1, 2, 3, 4]. 
[1,2,3,4] 
4> lists:zip3(L1, L2, L3). 
[{1,a,1},{2,b,2},{3,c,3},{4,d,4}] 
1

Continuation-passing style

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}]