If your list is a vector (has no sub-lists) this is perhaps the simplest way, and likely competitively fast: m = origlist; m[[{1, 5}]] = {{r, x}, m[[{1, 5}]]}\[Transpose] Flatten[m] > {r, a, b, c, d, x, e, f, g} If your list is not a vector (as defined above) we could use a different head for the inserted elements and then replace it with `Sequence` to effect a flatten. Here is a function that handles both cases, selecting between the methods for best performance: multiInsert[list_List, val_, pos_] /; Length@val == Length@pos := Module[{m = list, f}, If[VectorQ[list], m[[pos]] = Transpose @ {val, m[[pos]]}; Flatten[m], m[[pos]] = MapThread[f, {val, m[[pos]]}]; m /. f -> Sequence ] ] Input is a little different than yours: multiInsert[Range@15, {a, b, c}, {3, 7, 13}] > {1, 2, a, 3, 4, 5, 6, b, 7, 8, 9, 10, 11, 12, c, 13, 14, 15}