我如何实现第9行和第10行,即python中的两个for
循环
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
newMatrix = []
for (i=0; i < len(matrix); i++):
for (j=0; j < len(matrix[i]); j++):
newMatrix[j][i] = matrix[i][j]
print newMatrix
PS:我知道我可以做[[row[i] for row in matrix] for i in range(4)]
但我只能使用for循环
答案 0 :(得分:2)
使用range
(或xrange
)。
for i in range(len(matrix)):
for j in range(len(matrix[i])):
仅供参考,分配到newMatrix[i][j]
将失败,因为newMatrix
为空list
。您需要为每一行向list
添加一个新的空newMatrix
,然后在每次迭代中将新值附加到该列表。
答案 1 :(得分:1)
您可以使用enumerate()
function循环遍历矩阵值并为您提供索引:
newMatrix = [[0] * len(matrix) for _ in xrange(len(matrix[0]))]
for i, row in enumerate(matrix):
for j, value in enumerate(row):
newMatrix[j][i] = value
输出:
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
因为您直接在新矩阵中寻址行和列,所以您需要首先使用空值初始化该新矩阵。我的示例第一行的列表理解为您做到了这一点。在给定输入矩阵大小( x , y <)的情况下,它会创建一个大小为( y , x )的新矩阵/ em>的)。
或者,您可以通过(ab)使用zip
function完全避免显式循环:
newMatrix = zip(*matrix)
获取matrix
的每一行,并将这些行中的每一列分组为新行。
在一般情况下,python for
构造循环序列。 range()
和xrange()
函数可以为您生成数字序列,这些函数生成一个数字序列,其方式与C或JavaScript中的for
循环产生的方式大致相同:
>>> for i in range(5):
>>> print i,
0 1 2 3 4
但是构造比C风格的for
构造强大得多。在大多数这样的循环中,你的目标是为某些序列提供索引,python构造绕过索引并直接转到序列中的值。
答案 2 :(得分:1)
如果您正在使用Python进行任何类型的矩阵运算,只需将其他内容添加到答案的混合中,请考虑使用numpy
:
>>> import numpy
>>> matrix = numpy.matrix([
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12]
... ])
转置非常简单:
>>> matrix.transpose()
matrix([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12]])
答案 3 :(得分:1)
如果我理解正确,你想要做的是matrix transposition,可以这样做:
zip(*matrix)