这是转置矩阵的代码的一部分,该函数接受一个参数,一个列表列表。我们假设输入是:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
基本上,输出应该返回
[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]
等等任何矩阵。 以下代码返回
def matrix(data)
column = len(data)
transposed[0].append(data[0][0])
transposed[0].append(data[1][0])
transposed[0].append(data[2][0])
outputs [1,4,7]
然而,当我尝试使其遵循colum length时,它会返回
transposed[0].append(data[0:column][0])
outputs [1,2,3]
我的代码出了什么问题?
答案 0 :(得分:5)
您可以使用内置函数zip
转置矩阵:
def transpose(m):
return zip(*m)
来自文档:
此函数返回元组列表,其中包含第i个元组 来自每个参数序列或迭代的第i个元素。该 返回的列表的长度被截断为最短的长度 论证序列。当有多个参数都是 相同的长度,
zip()
与map()
类似,初始参数为。{None
。使用单个序列参数,它返回一个1元组的列表。 没有参数,它返回一个空列表。保证了迭代的从左到右的评估顺序。 这使得将数据序列聚类成成语成为可能 使用
zip(*[iter(s)]*n)
的n长度组。
要使其返回列表而不是元组列表,请返回以下列表解析:
[list(r) for r in zip(*m)]
以下是使用append:
的方法def transpose(m):
transposed = [[] for _ in range(len(m[0]))]
for i in range(len(m)):
for j in range(len(m[0])):
transposed[j].append(m[i][j])
return transposed
如您所见,使用zip
要容易得多。 :)