# Join a list with {6, 6, 2} dimensions with a list {6, 6} dimensions

listA = {{a1, a2, a3, a4, a5, a6},
{b1, b2, b3, b4, b5, b6},
{c1, c2, c3, c4, c5, c6},
{d1, d2, d3, d4, d5, d6},
{e1, e2, e3, e4, e5, e6},
{f1, f2, f3, f4, f5, f6}}

listB = {{{n1, p1}, {n2, p2}, {n3, p3}, {n4, p4}, {n5, p5}, {n6, p6}},
{{q1, r1}, {q2, r2}, {q3, r3}, {q4, r4}, {q5, r5}, {q6, r6}},
{{s1, t1}, {s2, t2}, {s3, t3}, {s4, t4}, {s5, t5}, {s6, t6}},
{{u1, v1}, {u2, v2}, {u3, v3}, {u4, v4}, {u5, v5}, {u6, v6}},
{{x1, w1}, {x2, w2}, {x3, w3}, {x4, w4}, {x5, w5}, {x6, w6}},
{{y1, z1}, {y2, z2}, {y3, z3}, {y4, z4}, {y5, z5}, {y6, z6}}
}


I need to obtain list in the form:

{{{n1, p1, a1}, {n2, p2, a2}, {n3, p3, a3}, {n4, p4, a4}, {n5, p5, a5}, {n6, p6, a6}},
{{q1, r1,  b1}, {q2, r2, b2}, {q3, r3, b3}, {q4, r4, b4}, {q5, r5, b5}, {q6, r6, b6}},
{{s1, t1, c1}, {s2, t2, c2}, {s3, t3, c3}, {s4, t4,c4}, {s5,  t5, c5 }, {s6, t6, c6}},
.......etc...........{{y1, z1, f1}, {y2, z2, f2}, {y3, z3, f3},
{y4, z4, f4}, {y5, z5, f5}, {y6, z6, f6}}}


Any ideas how to do this generically - for a list of any number of rows and columns?

MapThread[Append, {listB, listA}, 2]


or

Join[
listB,
Map[List, listA, {-1}],
3
]

{{{n1, p1, a1}, {n2, p2, a2}, {n3, p3, a3}, {n4, p4, a4}, {n5, p5,
a5}, {n6, p6, a6}}, {{q1, r1, b1}, {q2, r2, b2}, {q3, r3, b3}, {q4,
r4, b4}, {q5, r5, b5}, {q6, r6, b6}}, {{s1, t1, c1}, {s2, t2,
c2}, {s3, t3, c3}, {s4, t4, c4}, {s5, t5, c5}, {s6, t6, c6}}, {{u1,
v1, d1}, {u2, v2, d2}, {u3, v3, d3}, {u4, v4, d4}, {u5, v5,
d5}, {u6, v6, d6}}, {{x1, w1, e1}, {x2, w2, e2}, {x3, w3, e3}, {x4,
w4, e4}, {x5, w5, e5}, {x6, w6, e6}}, {{y1, z1, f1}, {y2, z2,
f2}, {y3, z3, f3}, {y4, z4, f4}, {y5, z5, f5}, {y6, z6, f6}}}

• When I saw this I deleted my answer, I'm new to understanding MapThread or MapIndexed, and this is clearly what it is meant for. But then I undeleted because, well, I feed off of imaginary internet points. Apr 26, 2016 at 18:31
• @JasonB it's convenient and short I always liked such solutions. But you never know if short solution won't unpack an array or something, resulting in a worse performance. At least I won't know because I'm not able to track all those things :) I would stop using MMA long time ago but those imaginary points kept me rolling, hate that now :). p.s. Congratulations for your new job :)
– Kuba
Apr 26, 2016 at 21:01
• Thanks! I'm really looking forward to it :-) Apr 27, 2016 at 10:04
ArrayReshape[Flatten[{##}, {2, 3}], Dimensions[#] + {0, 0, 1}] &[listB, listA]


Flatten /@ Thread[{#1, #2}] & @@@ Transpose[{listB, listA}]

(* {{{n1, p1, a1}, {n2, p2, a2}, {n3, p3, a3}, {n4, p4,
a4}, {n5, p5, a5}, {n6, p6, a6}}, {{q1, r1, b1}, {q2, r2, b2}, {q3,
r3, b3}, {q4, r4, b4}, {q5, r5, b5}, {q6, r6, b6}}, {{s1, t1,
c1}, {s2, t2, c2}, {s3, t3, c3}, {s4, t4, c4}, {s5, t5, c5}, {s6,
t6, c6}}, {{u1, v1, d1}, {u2, v2, d2}, {u3, v3, d3}, {u4, v4,
d4}, {u5, v5, d5}, {u6, v6, d6}}, {{x1, w1, e1}, {x2, w2, e2}, {x3,
w3, e3}, {x4, w4, e4}, {x5, w5, e5}, {x6, w6, e6}}, {{y1, z1,
f1}, {y2, z2, f2}, {y3, z3, f3}, {y4, z4, f4}, {y5, z5, f5}, {y6,
z6, f6}}} *)

☺ = {## & @@ #, #2} & @@@ # & /@ (# & /@ ({##} &@##)) &;
☺[listB, listA]


• ... yet another member of the look ma no letters! family:)
– kglr
Apr 26, 2016 at 21:25
• Yes enjoyed this one with no words
– SPIL
Apr 29, 2016 at 8:54
• It reminds me of those answers you see in code golf competitions. May 4, 2016 at 10:26

There are good methods already posted so instead of pragmatic I shall aim for unusual.

mkpull[x_] := Module[{i = 1}, x[[i++]] &]

pull = mkpull @ Flatten @ listA;

PadRight[listB, {Automatic, Automatic, 3}, Unevaluated @ pull[]]


Please don't actually use this. ;^)

For people who find difficult to work with more than 2 dimensions at a time:

Join[ listB[[#]], Transpose[ {listA[[#]]} ], 2 ] & /@ Range[Length[listB]]


or even more pedestrian using Table

Table[ Join[listB[[i]], Transpose[ {listA[[i]]} ], 2], {i, Length[listB]}]