1

我有一个 Python 任务,我必须在不使用任何 for 循环但仅使用列表理解的情况下转置多维矩阵(3x3、4x4、5x5 ...)。

作为 2x2 矩阵的示例,我们有:

a2 = [[1, 2], [3, 4]]
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

但我不确定我是否真的了解它的工作原理或如何将其调整为 3x3、4x4、5x5... 矩阵

例如,与

a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

我不一定要你给我答案(仍然需要自己弄清楚),但任何提示都会非常有帮助!

提前致谢!

4

2 回答 2

6

我很确定你已经在你的例子中拥有它......

a2 = [[1, 2], [3, 4]]  #2x2
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

a2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  #3x3
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

物体:

a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

不是 2x2、3x3 或 4x4——它是 2x2x2。您需要准确解释transpose该数据结构的含义。

作为旁注,如果您没有将列表理解作为约束,zip那么按照 Lattyware 的建议使用是您应该这样做的方式——我只是想指出您的解决方案已经适用于这种NxN情况。

于 2013-01-25T14:56:27.467 回答
5

有一个内置的-zip()函数

>>> list(zip(*[[1, 2], [3, 4]]))
[(1, 3), (2, 4)]

请注意,调用list()是为了显示结果,在 3.x 中,这会产生一个可迭代的,而不是一个列表(这是惰性的,提供内存优势)。在 2.x 中,它无论如何都会返回一个列表。

如果您还想在具有更多嵌套列表的示例中转置内部部分,那么使用列表推导在子列表上运行相对简单zip()

为了便于阅读,2.x 中的示例:

>>> zip(*(zip(*part) for part in [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]))
[((1, 3), (5, 7)), ((2, 4), (6, 8))]
于 2013-01-25T14:54:16.827 回答