交换三个数据集的简单/有效方法是什么。
Data1 = [<<5>>,<<6>>,<<7>>],
Data2 = [<<5>>,<<6>>,<<7>>],
Data3 = [<<5>>,<<6>>,<<7>>].
结束结果:
Final = [<<5>>, <<5>>, <<5>>, <<6>>, <<6>>, <<6>>, <<7>>, <<7>>, <<7>>]
我确定它就像
[X || X <- [Data1, Data2, Data3]]
答案 0 :(得分:2)
您可以编写自定义zip
功能来完成此操作。
zip([HX | TX], [HY | TY], [HZ | TZ]) -> [[HX, HY, HZ] | zip(TX, TY, TZ)];
zip([], [], []) -> [].
只要输入的长度相同,此功能就可以正常工作。处理不同长度的输入将需要一些修补。像这样:
zip(X, Y, Z) when length(X) =:= 0; length(Y) =:= 0; length(Z) =:= 0 -> [];
zip([HX | TX], [HY | TY], [HZ | TZ]) -> [[HX, HY, HZ] | zip(TX, TY, TZ)].
这样称呼它:
7> my_module:zip(Data1, Data2, Data3).
[[<<5>>,<<5>>,<<5>>],
[<<6>>,<<6>>,<<6>>],
[<<7>>,<<7>>,<<7>>]]
另见:标准库函数lists:zip3
。
答案 1 :(得分:2)
模块功能:
zip3(X, Y, Z) when X =:= []; Y =:= []; Z =:= [] -> [];
zip3([HX | TX], [HY | TY], [HZ | TZ]) -> [ HX, HY, HZ | zip3(TX, TY, TZ)].
在shell中相同:
F = fun(D1, D2, D3) ->
G = fun(F, X, Y, Z) when X =:= []; Y =:= []; Z =:= [] -> [];
(F, [HX | TX], [HY | TY], [HZ | TZ]) -> [ HX, HY, HZ | F(F, TX, TY, TZ)]
end,
G(G, D1, D2, D3)
end,
Data1 = [<<5>>,<<6>>,<<7>>],
Data2 = [<<5>>,<<6>>,<<7>>],
Data3 = [<<5>>,<<6>>,<<7>>],
F(Data1, Data2, Data3).
[<<5>>,<<5>>,<<5>>,<<6>>,<<6>>,<<6>>,<<7>>,<<7>>,<<7>>]
当然,您可以使用lists
模块执行此操作:
lists:append(lists:zipwith3(fun(X, Y, Z) -> [X, Y, Z] end, Data1, Data2, Data3)).
[<<5>>,<<5>>,<<5>>,<<6>>,<<6>>,<<6>>,<<7>>,<<7>>,<<7>>]
答案 2 :(得分:0)
Final = Data1 ++ Data2 ++ Data3.
答案 3 :(得分:0)
这是我的目标。有了它,您可以根据需要添加任意数量的数据集,只需将它们添加到列表中即可。它还考虑了列表是否大小不同。如果二进制数据可能很大或者它是一个非常常见的函数,使用新的二进制模块而不是将二进制数据分解为1字节列表可能更有效。
-module(zippy).
-compile(export_all).
zipAll(L) -> zip({L,[]}).
zip({L,Final}) ->
case lists:any(fun(X) -> case X of [] -> false; _ -> true end end,L) of
true -> zip(lists:mapfoldl(fun x/2,Final,L));
_ -> lists:reverse(Final)
end.
x([],L) -> {[],[null|L]};
x([H|T],L) -> {T,[H|L]}.
start() ->
Data1 = [<<5>>,<<6>>,<<7>>],
Data2 = [<<5>>,<<6>>,<<7>>],
Data3 = [<<5>>,<<6>>,<<7>>],
Data4 = [<<5>>,<<6>>,<<7>>,<<1>>],
zipAll([Data1,Data2,Data3,Data4]).
你正在考虑列表理解 [{X,Y,Z} || X&lt; -Data1,Y&lt; -Data2,Z&lt; -Data3]] 这更有助于产生秩序无关紧要的所有可能性。