# Replace a range of elements in a list with another list

For example, there's a list {0, ..., 0} of length n. Can I replace the first six elements with the elements of another list of length 6?

There are many ways to do this. One direct way is to use Part with ;;

listA = {1, 2, 3, 4, 5, 6, 7, 8, 9};
listB = {a, b, c, d, e, f};
If[Length[listA] >= Length[listB],
listA[[1 ;; Length[listB]]] = listB
,
Abort[]
]


And now listA is But there could be a more functional way to do this in one line, I am sure. Notice that a list is immutable in Mathematica. So the above will actually generate new listA and not modify the original listA under the cover.

version 12.3.1 on windows 10.

Clear["Global*"]


This will replace the first six positions of the first list with the complete second list for any length of the second list.

Format[a[n_]] := Subscript[a, n]
Format[b[n_]] := Subscript[b, n]

listA = Array[a, 10];
listB = Array[b, 6];

listC = ReplacePart[Partition[listA, UpTo], 1 -> listB] //
Flatten list1 = ConstantArray[0, 10];
list2 = Array[x, 6];


Several alternative methods:

PadRight[list2, Length@list1]

SubsetMap[list2 &, list1, Range @ 6]

ReplacePart[list1, Thread[Range @ 6 -> list2]]

Normal @ SparseArray[Range -> list2, {10}]


all give

{x, x, x, x, x, x, 0, 0, 0, 0}


list1={0,0,0,0,0,0,0,0,0,0};
list2={1,2,3,4,5,6};


you can perform the operation you want by

list1[[1;;6]]=list2;

• Duplicates answer by Nasser. Oct 4, 2021 at 21:58
• While both answers use the same underlying method, I would disagree that this is a duplicate. I just answered assuming that the author of the question knows the length of both lists, an there would be no need to check for that, nor to specify the length of the second list with Length. Definitely Nasser's answer is more versatile, but it is possible that user174967, or any other user, benefits from having a more straightforward, one line answer in here. Oct 4, 2021 at 22:09
alist = Range[1, 10]
blist = CharacterRange["a", "f"]


{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

{"a", "b", "c", "d", "e",> "f"}

Without length validation:

blist~Join~Take[alist, {7, -1}]

Take[blist, 6]~Join~Drop[alist, 6]

Join[blist, Last@TakeDrop[alist, 6]]

{blist, alist[[7 ;; -1]]} // Flatten

alist /. {(alist[[#]] -> blist[[#]] &) /@ Range} // Flatten
`

would all yield:

{"a", "b", "c", "d", "e", "f", 7, 8, 9, 10}