getting zero for special positions in a matrix
list.DiagonalMatrix[{1, 0, 0, 1, 0}]
or
Inner[Times, list, {1, 0, 0, 1, 0}, List] // MatrixForm
$$\left( \begin{array}{ccccc} 1 & 0 & 0 & 2 & 0 \\ 3 & 0 & 0 & 2 & 0 \\ 3 & 0 & 0 & 3 & 0 \\ 1 & 0 & 0 & 1 & 0 \\ \end{array} \right)$$
Edit
It may also be done as follows using Inner (see here):
Inner[Times, list, DiagonalMatrix[{1, 0, 0, 1, 0}]] // MatrixForm
With Dot and SparseArray:
list.SparseArray[{ {1, 1} -> 1, {4, 4} -> 1}, {5, 5}] // MatrixForm
In 'pseudocode':
newmat = oldmat.SparseArray[{ {<col-position-old>, <col-position-new>} -> 1,
...}, {< total-cols-old >, <total-cols-new>}]
For example, to create a new list with col-1-old -> col-4-new, col-4-old -> col-1-new, col-3-old -> col-2-new
, and entries in all other columns equal to zero:
list1 // #.SparseArray[{ {1, 4} -> 1, {4, 1} -> 1, {3, 2} ->
1}, {Dimensions[#][[2]], 5}] & // MatrixForm
$$ \left( \begin{array}{ccccc} 2 & 3 & 0 & 1 & 0 \\ 2 & 1 & 0 & 3 & 0 \\ 3 & 1 & 0 & 3 & 0 \\ 1 & 1 & 0 & 1 & 0 \\ \end{array} \right)$$
To preserve the original list you could do
res = list;
res[[All, {2, 3, 5}]] = 0;
res // MatrixForm
Or
MapAt[0&, list, {All, {2, 3, 5}}] // MatrixForm
Or (thanks @kglr)
ReplacePart[list, {{_, 2 | 3 | 5} -> 0}] // MatrixForm
All give