4

I have a Table of values e.g.

{{x,y,z},{x,y,z},{x,y,z}…}

How do I replace the the "z" column with a List of values?

Kuba
  • 136,707
  • 13
  • 279
  • 740
Ren
  • 43
  • 1
  • 3

4 Answers4

3

If you mean each column in each respective sublist with the respective value from the value list, the first, if you mean replacing all with a literal list, the second.

test = {{a, b, c}, {d, e, f}, {g, h, i}}
test[[All, 3]] = {1, 2, 3};
test
test[[All, 3]] = Sequence[{1, 2, 3}];
test

(*
{{a, b, 1}, {d, e, 2}, {g, h, 3}}

{a, b, {1, 2, 3}}, {d, e, {1, 2, 3}}, {g, h, {1, 2, 3}}

*)
ciao
  • 25,774
  • 2
  • 58
  • 139
  • Thanks, I meant the first. However my List of values is really long, so in your example: List1={1,2,3,…..n}. However test[[All, 3]] = List1 doesn't seem to work? – Ren Feb 14 '14 at 00:59
  • @ren: When doing the first type of replacement, the target list must have as many sublists as the replacement values list, i.e., if you have ten sublists of three values each, and you want to replace the last in each, the replacement list must be ten values. If it isn't, the behavior will mimic the second. Perhaps you could update your question with more concrete examples? – ciao Feb 14 '14 at 01:03
  • That sorted it, thanks! – Ren Feb 14 '14 at 01:09
3
fun[u_, c_, r_] := Transpose@ReplacePart[Transpose[u], c -> r]

Example:

list = {{a, b, c}, {a, b, c}, {a, b, c}};
fun[list, 1, Range[3]]

yields:

{{1, b, c}, {2, b, c}, {3, b, c}}

This requires the replacement column be the same length (which I have assumed as intention) as final transpose will fail if this is not the case.

ubpdqn
  • 60,617
  • 3
  • 59
  • 148
2
list = {{x, y, z}, {x, y, z}, {x, y, z}};

v = {3, 1, 6};

Using ReplacePart

ReplacePart[list, {i_, 3} :> v[[i]]]

{{x, y, 3}, {x, y, 1}, {x, y, 6}}

With MapThread and Splice (new in 12.1)

MapThread[{Splice @ Most @ #1, #2} &, {list, v}]

{{x, y, 3}, {x, y, 1}, {x, y, 6}}

eldo
  • 67,911
  • 5
  • 60
  • 168
1

Using ArrayRules and ReplacePart:

list = {{x, y, z}, {x, y, z}, {x, y, z}};

v = {3, 1, 6};

RepCol[m_, c_, p_] := Module[{arules}, arules = Most @ ArrayRules @ m; ReplacePart[m, Thread[ Rule[ Part[Cases[arules, Rule[{x_, y_}, z_] /; Equal[y, p]], All, 1 ], c ] ] ] ];

RepCol[list, v, 2]

({{x, 3, z}, {x, 1, z}, {x, 6, z}})

RepCol[list, v, 3]

({{x, y, 3}, {x, y, 1}, {x, y, 6}})

Or using BlockMap and MapAt:

RepCol[m_, c_, p_] := Table[
    First[
            BlockMap[
                Function[
                    MapAt[Function[x, (x + Part[c, i]) - x],
                        #, {p}
                    ]
                ],
                Flatten @ m, Length @ m
            ]
        ],
    {i, Length @ m}
   ];

RepCol[list, v, 2]

({{x, 3, z}, {x, 1, z}, {x, 6, z}})

RepCol[list, v, 3]

({{x, y, 3}, {x, y, 1}, {x, y, 6}})

E. Chan-López
  • 23,117
  • 3
  • 21
  • 44