如何在Python中输入矩阵(二维列表)?

15
我试图创建一个能够输入m行n列矩阵的代码。我想要输入[[1,2,3],[4,5,6]],但是这段代码返回的是[[4,5,6],[4,5,6]。当我输入其他的m行n列矩阵时,同样会出现每一行都相同的情况。
也许你可以帮我找出代码哪里出了问题。
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)

16个回答

20
问题出现在初始化步骤。
for i in range (0,m):
  matrix[i] = columns

这段代码实际上使得您的matrix的每一行都指向同一个columns对象。如果任何一列中的任何项发生更改,其他所有列也会发生更改:

>>> 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]]

您可以使用嵌套循环来初始化矩阵,如下所示:

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

或者,你可以使用列表推导式来写成一行:

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

或:

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

参见:

希望这有所帮助。


10

你可以用以下方法在Python中接受一个二维列表...

简单明了。

arr2d = [[j for j in input().strip()] for i in range(n)] 
# n is no of rows


适用于字符

n = int(input().strip())
m = int(input().strip())
a = [[0]*n for _ in range(m)]
for i in range(n):
    a[i] = list(input().strip())
print(a)
或者
n = int(input().strip())
n = int(input().strip())
a = []
for i in range(n):
    a[i].append(list(input().strip()))
print(a)

对于数字

n = int(input().strip())
m = int(input().strip())
a = [[0]*n for _ in range(m)]
for i in range(n):
    a[i] = [int(j) for j in input().strip().split(" ")]
print(a)

其中n是列中元素的数量,而m是行中元素的数量。

用Pythonic方式来说,这将创建一个列表的列表


5
如果您想要输入n行数据,每行包含m个以空格分隔的整数,例如:
1 2 3
4 5 6 
7 8 9 

那么您可以使用:

a=[] // declaration 
for i in range(0,n):   //where n is the no. of lines you want 
 a.append([int(j) for j in input().split()])  // for taking m space separated integers as input

然后根据上述输入打印任何您想要的内容:
print(a[1][1]) 

对于从0开始的索引,输出将为5。


5
如果输入格式如下:
1 2 3
4 5 6
7 8 9

一个命令行可以被使用。
mat = [list(map(int,input().split())) for i in range(row)] 

示例说明:

  1. input() 接受一个字符串作为输入。 "1 2 3"
  2. split() 将字符串按空格分割并返回字符串列表。 ["1", "2", "3"]
  3. list(map(int, ...)) 将字符串列表转换/映射为整数列表。 [1, 2, 3]
  4. 所有这些步骤都会重复 row 次,并将这些列表存储在另一个列表中。[[1, 2, 3], [4, 5, 6], [7, 8, 9]], row = 3

请给我提供任何参考链接或解释这个语句是如何工作的? - Taufiq Ahommed Neloy
@TaufiqAhommedNeloy 我已经添加了一个解释。 - Julkar9
非常感谢您的解释,@Julkar9。 - Taufiq Ahommed Neloy

2
除了已接受的答案外,您还可以按以下方式初始化行 - matrix[i] = [0]*n 因此,以下代码片段将起作用 -
m = int(input('number of rows, m = '))
n = int(input('number of columns, n = '))
matrix = []
# initialize the number of rows
for i in range(0,m):
    matrix += [0]
# initialize the matrix
for i in range (0,m):
    matrix[i] = [0]*n
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)

1

m,n=map(int,input().split()) # m - 行数; n - 列数;

matrix = [[int(j) for j in input().split()[:n]] for i in range(m)]

for i in matrix:print(i)


2
你能解释一下为什么这个回答可以解决提问者的问题吗? - executable

1
no_of_rows = 3  # For n by n, and even works for n by m but just give no of rows
matrix = [[int(j) for j in input().split()] for i in range(n)]
print(matrix)

1
这段代码从用户那里获取行和列的数量,然后获取元素并将其显示为矩阵。
m = int(input('number of rows, m : '))
n = int(input('number of columns, n : '))
a=[]
for i in range(1,m+1):
  b = []
  print("{0} Row".format(i))
  for j in range(1,n+1):
    b.append(int(input("{0} Column: " .format(j))))
  a.append(b)
print(a)

1
如果您的矩阵以行方式给出,如下所示,其中大小为s*s,这里s=5 5 31 100 65 12 18 10 13 47 157 6 100 113 174 11 33 88 124 41 20 140 99 32 111 41 20 那么您可以使用以下方法
s=int(input())
b=list(map(int,input().split()))
arr=[[b[j+s*i] for j in range(s)]for i in range(s)]

你的矩阵将会是 'arr'


1
你可以制作任何尺寸的列表。
list=[]
n= int(input())
for i in range(0,n) :
    #num = input()
    list.append(input().split())
print(list)

output:

code in shown with output


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接