# Subdividing list with another list as a reference

I have a list of seven elements:

list1={0,10,-20,15,-25,20,-30};


I have also another list of six elements:

div={10,15,20,15,10,5};


I would like to create a list subdividing the values of list1 using values of div list as a reference:

Subdivide[0,10,10]
Subdivide[10,-20,15]
Subdivide[-20,15,20]
Subdivide[15,-25,15]
Subdivide[-25,20,10]
Subdivide[20,-30,5]


## 6 Answers

The answer you want can be reached this way:

list1=Partition[list1,2,1]
f=MapThread[Insert,{list1,div,Table[3,{Length[list1]}]}];
Apply[Subdivide,f[[#]]]&/@Range[Length[list1]]

• Or MapThread[subdivide[First@#1, Last@#1, #2] &, {Partition[list1, 2, 1], div}] – bienti Oct 25 '16 at 13:37
Subdivide @@@ Partition[Flatten@Riffle[Partition[list1, 2, 1], div], 3]


or

Subdivide @@@ Flatten /@ Transpose[{Partition[list1, 2, 1], div}]


or

Subdivide @@@ Transpose@{list1[[;; -2]], list1[[2 ;;]], div}


or

Subdivide @@@ Transpose@{Most@list1, Rest@list1, div}


Can it be done shorter....

Another way:

MapThread[Subdivide, {Most@list1, Rest@list1, div}]

• My fav so far, avoids the Transpose. – Quantum_Oli Oct 25 '16 at 17:27

Quite short:

Subdivide @@@ MapThread[Insert[##, 3] &, {Partition[list1, 2, 1], div}]


or crudely

Table[Subdivide[list1[[i]], list1[[i + 1]], div[[i]]], {i, 1, Length @ div}]


Another simple solution:

Most[list1] + Differences[list1] Map[Subdivide, div]


Also:

Thread@Subdivide[Most@list1, Rest@list1, div]


You can also use Range (which is Listable and threads over its arguments) instead of Subdivide.

Range[Most@#, Rest@#, Differences@#/#2] &[list1, div]


{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10, -12, -14, -16, -18, -20},
{-20, -(73/4), -(33/2), -(59/4), -13, -(45/4), -(19/2), -(31/4), -6, -(17/4), -(5/ 2), -(3/4), 1, 11/4, 9/2, 25/4, 8, 39/4, 23/2, 53/4, 15},
{15, 37/3, 29/3, 7, 13/3, 5/3, -1, -(11/3), -(19/3), -9, -(35/3), -(43/3), -17, -(59/3), -(67/ 3), -25},
{-25, -(41/2), -16, -(23/2), -7, -(5/2), 2, 13/2, 11, 31/ 2, 20}, {20, 10, 0, -10, -20, -30}}