# An easier and more efficient way to combine lists?

I currently have a two lists. The first list contains independent variables $x$, and the second list contains dependent variables in the form of $\{\{f[x]\},\{f[x]\},...,\{f[n][x]\}\}$.

I want to combine them in the form $$\{\{\{x1,f[x1]\},\{x2,f[x2]\},...,\{xn,f[xn]\}\},\{\{x1,f[x1]\},\{x2,f[x2]\},...,\{xn,f[xn]\}\},...,\{\{x1,f[n][x1]\},\{x2,f[n][x2]\},...,\{xn,f[n][xn]\}\}\}$$ ...an easy format for ListPlot.

For some example data:

a = Range;
b = a^2;
c = (a + 1/2)^2;
fa = {b,c};


Now one can easily do this with Table:

Table[{a[[j]], fa[[i, j]]}, {i, Length[fa]}, {j, Length[c]}]


but knowing Mathematica's many functions I thought there might be an easier way. I tried this as well:

Transpose@MapThread[Tuples@{{#1}, #2} &, {a, Transpose@fa}]


but with the multiple Transpose calls, I figured there would be a slight performance hit. And there was (2.854 vs 3.261 seconds for vectors with 1MM elements on my machine).

Is there an easier and more efficient way to combine these lists?

• So in your notation, f[x1] really means f[[1,1]] and not SubValues? – rm -rf Nov 28 '12 at 20:33
• @rm-rf, Nah, it just means f is a data vector that corresponds to the x-values. f is another data vector not related to f. Etc. Feel free to suggest another notation. – kale Nov 28 '12 at 20:38
• Also MapThread[List, {a, #}] & /@ fa will do the job. – garej Dec 26 '15 at 12:02

Thread[{a, #}] & /@ fa

Inner[List, a, #, List] & /@ fa

• Yep. I love how I come up with Transpose@MapThread[Tuples@{{#1}, #2} &, {a, Transpose@fa}] but not Thread[{a,#}]&/@fa. Sigh. In any regards, the Thread method is 7.5x faster and the Inner method is 12x faster than the MapThread I suggested. Thanks! – kale Nov 28 '12 at 23:29
• @kale could you say how fast is Array in your setup? – au700 Nov 29 '12 at 1:26
• @au700, You'll have to elaborate. Not sure I see a way to use Array to solve the problem... – kale Nov 29 '12 at 2:34