【问题标题】:Erlang lists:zip3 .. but more than 3Erlang 列表:zip3 .. 但超过 3 个
【发布时间】:2012-01-19 09:47:21
【问题描述】:

所以我们可以在erlang中使用这个函数

DataList = lists:zip3(Data1, Data2, Data3)

生成:

Eshell V5.9  (abort with ^G)
1> Data1 = ["aaa","bbb","ccc"].
["aaa","bbb","ccc"]
2> Data2 = ["aaa2","bbb2","ccc2"].
["aaa2","bbb2","ccc2"]
3> Data3 = ["aaa3","bbb3","ccc3"].
["aaa3","bbb3","ccc3"]
4> DataList = lists:zip3(Data1, Data2, Data3).                                   
[{"aaa","aaa2","aaa3"},
 {"bbb","bbb2","bbb3"},
 {"ccc","ccc2","ccc3"}]

我需要可以自动执行此操作的东西:

DataList = lists:zipN(Data1, Data2, Data3, ... Data N)

【问题讨论】:

    标签: list erlang zip


    【解决方案1】:

    像这样编写你自己的 zipN 函数:

    zipN([]) ->
        [];
    zipN(ListOfLists) ->
        zipN([], ListOfLists, [], []).
    
    zipN(Ts, [], E, Acc) ->
        zipN([], lists:reverse(Ts), [], [list_to_tuple(lists:reverse(E)) | Acc]);
    
    zipN(Ts, [[Head | Tail] | ListOfLists], E, Acc) ->
        zipN([Tail | Ts], ListOfLists, [Head | E], Acc);
    
    zipN([], _, [], Acc) ->
        lists:reverse(Acc).
    

    【讨论】:

    • 您的解决方案不适用于 zipN(["a", ""])。作为第二个子句(??)添加到 zipN/4:zipN(_, [[] | _], _, Acc) -> lists:reverse(Acc); 至少会解决这个问题。这看起来像是 QuickCheck 或 PropEr 应该有用的东西,不幸的是我要到明天才能尝试..
    • 我不认为这是一个好的决定,试着解释一下:如你所见,我的第一个论点叫做ListOfLists。正如您已经知道的那样,erlang 中的字符串是带有数字的简单列表。在您的示例中,您提供 2 个列表作为输入值,第一个列表的长度 =:= 1,第二个列表的长度 =:= 0。不要认为尝试使用输入值解决此问题是件好事。
    • 很公平,我没有注意到在 Erlang 中 zip 仅适用于等长列表...但我可以指出您的 zipN(["", "x"]) 和 zipN( ["ab", "xyz"]) 似乎成功了:-)
    • 哎呀,看起来像一个错误:-D。我可以提出一个有点丑陋的解决方案,用这样的代码更改 zipN/1:zipN([]) -> []; zipN(ListsOfLists = [H | _]) -> L1 = length(H), true = lists:all(fun(X) -> length(X) =:= L1 end, ListsOfLists), zipN([], ListsOfLists, [], []). 但由于 length/1 具有 O(N) 复杂度,这并不好。今天再想想,也许应该彻底改写
    【解决方案2】:

    你不能这样做(除非使用parse_transform),因为Erlang 函数不能有可变数量的参数。您的函数必须接受列表列表:

    DataList = lists:zipN([Data1, Data2, Data3, ... DataN])
    

    这可以通过transposing 列表然后converting 结果的每个元素到一个元组来完成。

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 2011-06-17
      • 2018-02-07
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      相关资源
      最近更新 更多