2010-08-13 6 views
5

뭐죠 세 개의 데이터 세트를 인터리빙의 쉬운/효율적인 방법 ..얼랑 - 인터리브 쉬운 방법

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

답변

2

모듈 기능 : 쉘에서

zip3(X, Y, Z) when X =:= []; Y =:= []; Z =:= [] -> []; 
zip3([HX | TX], [HY | TY], [HZ | TZ]) -> [ HX, HY, HZ | zip3(TX, TY, TZ)]. 

같은 :

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>>] 
+1

덕분에 매력처럼 작동합니다. – BAR

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.

+0

list : zipwith3을 사용하여 직접 순환 루프를 작성하지 않아도됩니다. – cthulahoops

+0

@cthulahoops :'lists : zip3'을 언급했음을 알게 될 것입니다. 그러나 OP는'zip3'이 생성하는 튜플 목록보다는 목록리스트를 원했습니다. 따라서 내 자신의 기능을 굴렸다. 필자는 튜플을 목록으로 변환 할 수 있다고 확신합니다. –

+0

튜플 /리스트 문제를 다루는리스트 인 zipwith3 (fun (X, Y, Z) -> [X, Y, Z] end, Data1, Data2, Data3))을 생각해 보았습니다. – cthulahoops

0
Final = Data1 ++ Data2 ++ Data3. 
+1

OP가 _concatenate_ 목록을 원하고 있다고 생각하지 않습니다. 당신이 게시 한 코드 조각은 [,>,><<6>>, <<7>>, <<5>>, <<6>>, <<7>>, <<5>>, <<6>을 <<5>을 <<7>>]'생산합니다'그가로'Final'을 무엇을 기대하지 않은. –

+0

아! 네가 옳아. 나는 interleaving 부분을 완전히 놓쳤다. – ram

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 < -Data1, Y < -Data2, Z < - Data3]] 주문이 중요하지 않은 모든 가능성을 더 많이 생성합니다.