我试图弄清楚如何用包含不等量元素的向量转置矩阵。
我正在学习编程,目前正在研究Python教程,并且停留在https://docs.python.org/3/tutorial/datastructures.html#nested-list-comprehensions此处的“嵌套列表推导”中列出的示例上。
以下是Python教程中显示的示例的非常细微的变化:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
[[row[i] for row in matrix] for i in range(3)]
我决定为该示例创建自己的解决方案,因为我希望代码更具动态性,这是这样的:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
[[row[i] for row in matrix] for i in range(len(matrix))]
但是,在提出我的解决方案后不久,我注意到仍然有很多方法可以解决这个问题,并尝试找出在以下任何情况下都不会失败的解决方案:
# Scenario 1: Vectors of unequal length sizes.
matrix = [
[1, 2, 3, 4],
[5, 6, 7],
[8, 9, 10, 11]
# Scenario 2: len(vector) > len(matrix)
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8]
]
# Scenario 3: len(vector) < len(matrix)
matrix = [
[1, 2],
[3, 4],
[5, 6],
[7, 8]
]
如果任何人都可以使用嵌套列表推导方法提出能够解决所有这三种情况的解决方案,我将非常感谢您的帮助。
答案 0 :(得分:0)
免责声明:所有这些假定您的行都具有相同的长度(对于矩阵来说应该如此)。
只需稍作调整即可:
[[row[i] for row in matrix] for i in range(len(matrix[0]))]
关键是要使i
处于矩阵len(matrix[0])
的行的长度范围内(我在这里使用第一行,因为它总是应该存在的)。
一种更优雅的方法是使用zip
:
list(zip(*matrix))
尽管您将获得tuple
作为行。如果您需要列表,可以这样做:
[list(row) for row in zip(*matrix1)]
答案 1 :(得分:0)
通过将稀疏行向左折叠,这对于相等和不相等的行长都适用:
[[row[i] for row in matrix if i < len(row)] for i in range(max(len(r) for r in matrix))]
所以场景1
matrix = [
[1, 2, 3, 4],
[5, 6, 7],
[8, 9, 10, 11]]
成为
[[1, 5, 8],
[2, 6, 9],
[3, 7, 10],
[4, 11]]