10
$\begingroup$
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?

$\endgroup$
14
$\begingroup$
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}}}
$\endgroup$
  • $\begingroup$ 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. $\endgroup$ – Jason B. Apr 26 '16 at 18:31
  • $\begingroup$ @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 :) $\endgroup$ – Kuba Apr 26 '16 at 21:01
  • $\begingroup$ Thanks! I'm really looking forward to it :-) $\endgroup$ – Jason B. Apr 27 '16 at 10:04
7
$\begingroup$
ArrayReshape[Flatten[{##}, {2, 3}], Dimensions[#] + {0, 0, 1}] &[listB, listA]

Mathematica graphics

$\endgroup$
6
$\begingroup$
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}}} *)
$\endgroup$
3
$\begingroup$
☺ = {## & @@ #, #2} & @@@ # & /@ (# & /@ ({##} &@##)) &;
☺[listB, listA]

Mathematica graphics

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

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. ;^)

$\endgroup$
1
$\begingroup$

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]}]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.