[erlang-questions] zip for N lists?

Ivan Uemlianin ivan@REDACTED
Fri Oct 19 11:17:39 CEST 2012


Dear All

Erlang provides lists:zip/2 and /3 for zipping together two or three 
lists.  Is there anything ready available for zipping together 
arbitrarily many lists?  e.g., taking a list of lists as its input,

     zipN([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) ->
         [[1,4,7,10],[2,5,8,11],[3,6,9,12]].

If not, I cooked up the following:

     zip_lol([[]|_]) ->
         [];
     zip_lol(Lols) ->
         {Lohs, Lots} = lists:foldl(fun([H|T], {Hs,Ts}) ->
                                        {[H|Hs],[T|Ts]}
                                    end,
                                    {[],[]},
                                    Lols),
         [lists:reverse(Lohs) | zip_lol(Lots)].

This doesn't quite work, as only every other Lohs seems to need reversing:

     zip_lol([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) ->
        [[1,4,7,10],[11,8,5,2],[3,6,9,12]].

Actually, it's enough for my purposes, as I only need the sum of each 
loh, so I can use:

     zipwith_lol(_, [[]|_]) ->
         [];
     zipwith_lol(Fun, Lols) ->
         {Lohs, Lots} = lists:foldl(fun([H|T], {Hs,Ts}) ->
                                        {[H|Hs],[T|Ts]}
                                    end,
                                    {[],[]},
                                    Lols),
         [Fun(Lohs) | zipwith_lol(Fun, Lots)].

     zip_lol([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) ->
         [22,26,30].

What concerns me is performance.  My lols are likely to be quite large: 
10 to 20 lists, and each list could be 100k+ integers long (if it were 
Haskell each list would be one of those lazy infinite list stream things).

Is the fold the right way to do this, or have I missed something that 
would do the job faster?

With thanks and best wishes

Ivan


-- 
============================================================
Ivan A. Uemlianin PhD
Llaisdy
Speech Technology Research and Development

                     ivan@REDACTED
                      www.llaisdy.com
                          llaisdy.wordpress.com
               github.com/llaisdy
                      www.linkedin.com/in/ivanuemlianin

               "hilaritas excessum habere nequit"
                  (Spinoza, Ethica, IV, XLII)
============================================================



More information about the erlang-questions mailing list