我有2个矩阵
x = [[1,2,3],
[4,5,6],
[7,8,9]]
y = [0,2,4]
并且我想使用矩阵y中的每个元素来更改矩阵x的每一行中的每个第一个元素,这样最终结果将是
x = [[0,2,3],
[2,5,6],
[4,8,9]]
我尝试过此代码
x = [[1,2,3],[4,5,6],[7,8,9]]
y = [0,2,4]
for i in range (len(x)):
x[i][0] = y[0][i]
print (x)
但它仅返回“ TypeError:'int'对象不可下标”
有什么方法可以解决此问题,以及如何扩展它以使其适用于任何n * n矩阵?
答案 0 :(得分:1)
将x[i][0] = y[0][i]
更改为x[i][0] = y[i]
。
使用更少的索引来完成此操作的另一种方法:
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y = [0, 2, 4]
for x_row, y_int in zip(x, y):
x_row[0] = y_int
print(x)
答案 1 :(得分:1)
您没有矩阵。 x
是list
中的lists
,而y
是list
。它们可以表示矩阵/向量/等,但是它们最终都是数学抽象,可以用不同的方式在代码中实现。
第一种方法,即保持代码的结构,需要注意上述事实:由于y
是包含list
,ints
的{{1}}显然将不起作用,因为y[0][i]
始终是y[0]
,并且您不能进一步将下标运算符应用于int
。
因此,这将起作用:
ints
也就是说,这不是唯一的方法。如果您需要一种更实用的方法,则可以执行以下for i in range (len(x)):
x[i][0] = y[i]
理解:
list
这给出了相同的结果,但是以更抽象的方式解决了这个问题:新的[[y_value, *x_value[1:]] for x_value, y_value in zip(x, y)]
本身将包含list
,其中第一个元素来自lists
,其余元素来自{ {1}}。了解了这一点,我们可以按照此模式组成一个内部列表。
y
从x
和zip
创建值对的iterator
。使用此迭代器,可以将x
中每个值y
放在y
中每个值之前。最后,由于x
是list
,因此必须解压缩,这样我们得到的是x_value
而不是list
。
答案 2 :(得分:0)
使用Python,通常会尽可能避免使用索引。由于“矩阵”实际上是列表的列表,因此遍历行将返回列表,这些列表是可以直接操作的对象引用:
for row,value in zip(x,y): row[0] = value