Sté*_*iod 1 python list-comprehension matrix
我有一个Python分配,我必须转换一个多维矩阵(3x3,4x4,5x5 ...),而不使用任何for循环,但只使用列表理解.
作为2x2矩阵的示例,我们有:
a2 = [[1, 2], [3, 4]]
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]
Run Code Online (Sandbox Code Playgroud)
但我不确定我是否真的理解它的工作原理或如何使其适应3x3,4x4,5x5 ...矩阵
例如,有
a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
Run Code Online (Sandbox Code Playgroud)
我不一定要你给我答案(仍然需要自己弄明白),但任何提示都会非常有用!
提前致谢!
我很确定你已经在你的例子中有它...
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)]
Run Code Online (Sandbox Code Playgroud)
物体:
a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
Run Code Online (Sandbox Code Playgroud)
不是2x2,或3x3或4x4 - 它是2x2x2.您需要准确解释transpose该数据结构的确切含义.
作为旁注,如果你没有将列表理解作为约束,那么使用zipLattyware提出的方法是你应该这样做的方式 - 我只是想指出你的解决方案已经适用于NxN案例.
>>> list(zip(*[[1, 2], [3, 4]]))
[(1, 3), (2, 4)]
Run Code Online (Sandbox Code Playgroud)
请注意,调用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))]
Run Code Online (Sandbox Code Playgroud)