pythonlistinputmatrix

How to input matrix (2D list) in Python?


I tried to create this code to input an m by n matrix. I intended to input [[1,2,3],[4,5,6]] but the code yields [[4,5,6],[4,5,6]. Same things happen when I input other m by n matrix, the code yields an m by n matrix whose rows are identical.

Perhaps you can help me to find what is wrong with my code.

m = int(input('number of rows, m = '))
n = int(input('number of columns, n = '))
matrix = []; columns = []
# initialize the number of rows
for i in range(0,m):
  matrix += [0]
# initialize the number of columns
for j in range (0,n):
  columns += [0]
# initialize the matrix
for i in range (0,m):
  matrix[i] = columns
for i in range (0,m):
  for j in range (0,n):
    print ('entry in row: ',i+1,' column: ',j+1)
    matrix[i][j] = int(input())
print (matrix)

Solution

  • The problem is on the initialization step.

    for i in range (0,m):
      matrix[i] = columns
    

    This code actually makes every row of your matrix refer to the same columns object. If any item in any column changes - every other column will change:

    >>> for i in range (0,m):
    ...     matrix[i] = columns
    ... 
    >>> matrix
    [[0, 0, 0], [0, 0, 0]]
    >>> matrix[1][1] = 2
    >>> matrix
    [[0, 2, 0], [0, 2, 0]]
    

    You can initialize your matrix in a nested loop, like this:

    matrix = []
    for i in range(0,m):
        matrix.append([])
        for j in range(0,n):
            matrix[i].append(0)
    

    or, in a one-liner by using list comprehension:

    matrix = [[0 for j in range(n)] for i in range(m)]
    

    or:

    matrix = [x[:] for x in [[0]*n]*m]
    

    See also:

    Hope that helps.