Python 3中无需依赖NumPy库,实现二维列表转置并返回列表形式的更优方法是什么?
Python矩阵转置:更简洁的非NumPy实现
嘿,你提到的这个问题其实挺常见的,确实有更Pythonic而且简洁的写法,不用依赖NumPy~
你之前的list(map(list, zip(*matrix)))是有效的,但其实用列表推导式会更直观简洁,代码如下:
matrix = [[1,2,3], [4,5,6]] transposed = [list(col) for col in zip(*matrix)]
这个写法和你原来的实现效果完全一样,得到的是[[1,4], [2,5], [3,6]],而且可读性更强,很多Python开发者都会优先选择这种写法。
原理其实和你之前的思路一致:zip(*matrix)会把原矩阵的列打包成元组,然后列表推导式遍历每个元组,用list(col)把元组转换成列表,最终直接生成列表的列表,不需要再额外套一层list()去转换map对象。
如果你的矩阵可能存在行长度不一致的情况(比如有的行短有的行长),zip会自动截断到最短的行。这时候如果想保留所有元素,可以用itertools.zip_longest,示例如下:
from itertools import zip_longest matrix = [[1,2], [3,4,5]] transposed = [list(col) for col in zip_longest(*matrix, fillvalue=None)] # 输出结果: [[1, 3], [2, 4], [None, 5]]
这里的fillvalue可以指定填充缺失位置的默认值,比如你想填充0的话就改成fillvalue=0。
至于性能,列表推导式和你原来的list(map(list, zip(*matrix)))在效率上相差无几,但列表推导式的语法更符合Python的惯用风格,也更容易理解。
内容的提问来源于stack exchange,提问作者OnePiece
相关产品推荐
相关产品推荐

