我有一个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)]
但我不确定我是否真的了解它的工作原理或如何使其适应3x3,4x4,5x5 ......矩阵
例如,
a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
我不一定要你给我答案(仍然需要自己弄清楚),但任何提示都会非常有用!
提前致谢!
答案 0 :(得分: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
对该数据结构的确切含义。
作为旁注,如果你没有将list-comprehension作为约束,那么使用Lattyware提出的zip
是你应该这样做的方式 - 我只想指出您的解决方案已适用于NxN
案例。
答案 1 :(得分:5)
有一个内置功能 - the zip()
function。
>>> 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))]