Erlang списки: zip3 .. но более 3 - PullRequest
       22

Erlang списки: zip3 .. но более 3

1 голос
/ 18 января 2012

Таким образом, мы можем использовать эту функцию в 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)

Ответы [ 2 ]

3 голосов
/ 18 января 2012

напишите свою собственную функцию 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).
1 голос
/ 18 января 2012

Вы не можете сделать это буквально (за исключением использования parse_transform), потому что функции Erlang не могут иметь переменное число аргументов.Ваша функция должна была бы принять список списков:

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

Это можно сделать путем транспонирования списка и затем преобразования каждого элемента результата вкортеж.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...