10
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?

RunnyKine
  • 33,088
  • 3
  • 109
  • 176
SPIL
  • 627
  • 3
  • 10

6 Answers6

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

Mathematica graphics

kglr
  • 394,356
  • 18
  • 477
  • 896
6
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}}} *)
Jason B.
  • 68,381
  • 3
  • 139
  • 286
3
☺ = {## & @@ #, #2} & @@@ # & /@ (# & /@ ({##} &@##)) &;
☺[listB, listA]

Mathematica graphics

kglr
  • 394,356
  • 18
  • 477
  • 896
3

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

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
1

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]}]
Vito Vanin
  • 568
  • 2
  • 8