Zip 3 Списки в кортеж - Эрланг - PullRequest
2 голосов
/ 28 января 2011

Существует ли оптимизированный способ объединения 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}]

Ответы [ 3 ]

10 голосов
/ 28 января 2011

Кажется, вам нужно использовать списки: 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}]
6 голосов
/ 28 января 2011
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).
1 голос
/ 22 февраля 2011

In Стиль продолжения :

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