Shift and shuffle the rows of a matrix

Question:

I have a matrix as follows.

mat = [[23,45,56,67],
       [12,67,09,78],
       [20,59,48,15],
       [00,06,51,90]]

I want to write a function where depending on the argument passed to the function, the rows of the matrix must be shifted and shuffled. For eg: if the argument passed to the function is 2, then the 2nd row of the matrix mat must be made as 0th row while the rest of the rows 1-3 must be shuffled as shown below.

value = 2

mat = [[20,59,48,15],
       [00,06,51,90],
       [23,45,56,67],
       [12,67,09,78]]

The rows 1-3 in the above matrix should be randomly shuffled. One example of how the matrix should look like is shown above.

Is there a way to write a function for this?

Thanks!

Asked By: GGEng

||

Answers:

mat = [[23,45,56,67],
       [12,67,9,78],
       [20,59,48,15],
       [0,6,51,90]]

def shift(mat, row_index):
    return mat[row_index:] + mat[:row_index]

for row in shift(mat, 2): print(row)   

Output

[20, 59, 48, 15]
[0, 6, 51, 90]
[23, 45, 56, 67]
[12, 67, 9, 78]

EDIT :

My bad, I didn’t read the shuffle randomly part. Here’s the right function, put the 2th row in first place and shuffle the rest of the matrix.

def shift_and_shuffle(mat, row_index):
    rest_mat = mat[row_index+1:] + mat[:row_index]
    return [mat[row_index]] + random.sample(rest_mat, len(rest_mat))
Answered By: ArrowRise

the following function should work :

from random import shuffle
def shift_and_shuffle(mat: list, shift: int) -> list:
    mat_copy = mat[:]
    res = [mat_copy[shift]]
    mat_copy.remove(mat_copy[shift])
    shuffle(mat_copy)
    return res + mat_copy
Answered By: rochard4u
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.