【问题标题】:Zip 3 Lists into a Tuple- Erlang将 3 个列表压缩成一个元组 - Erlang
【发布时间】:2011-06-17 02:38:23
【问题描述】:

有没有优化的方法来压缩 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}]

【问题讨论】:

    标签: list erlang zip tuples


    【解决方案1】:

    看来你需要使用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}]
    

    【讨论】:

      【解决方案2】:
      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).
      

      【讨论】:

      • 请注意,在较新的 Erlang 版本中,适当的优化 myzip3acc/3 不一定比 myzip3/3 快。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2020-12-11
        • 2015-08-24
        • 2018-10-24
        • 2016-07-22
        • 2014-09-17
        • 2018-08-17
        相关资源
        最近更新 更多