以前写MMA,发现转置非常好用,特别是处理表格数据,可以很方便的行列互换然后直接一个map丢上去。
虽然也可以写Map[f,list,{2}]这种样子但是可读性比较糟糕,所以还是会选择转置之后处理。
后来也用py写一些东西,发现py不像mma有那么多官方函数,网上查到的基本都是用第三方库或者干脆是暴力写,非常不美:
def transpose(M):
# 初始化转置后的矩阵
result = []
# 获取转置前的行和列
row, col = shape(M)
# 先对列进行循环
for i in range(col):
# 外层循环的容器
item = []
# 在列循环的内部进行行的循环
for index in range(row):
item.append(M[index][i])
result.append(item)
return result
(别问我为啥缩进是两格我不知道 网上随便拉的)
还有的解决方案是直接用第三方库:
import numpy as np
np.transpose(List).tolist()
然后我也一直非常快乐的这么用下去了。后来发现不对:为啥有的时候输出结果没转成呢?
一开始非常费解,一开始的代码写的明明有问题,后来怎么老是变得啥都没干?还一点报错都没有。
后来发现问题,表头和后面长度不一样,会长出来一截,导致不是矩阵,没法转置。最后写成这样:
ret = np.transpose([ret_head[:len(ret_body[0])]] + ret_body).tolist()
非常的丑陋,后来了解了解包相关知识,又听说py3.9要改zip来增加参数可以遍历到底,才意识到我的需求可以很容易的用zip处理:自动按顺序取出传入的各个元素
忽略多余的元素
漂亮
返回迭代器
代码:
ret = zip(ret_head, *ret_body)
以前一直是把zip当成类似MapThread之类的东西,不常用,在了解解包知识之前也完全想不到要怎么处理整个二维表,后来知道了之后又完全没考虑到这一茬,这几天才意识到可以用。
本以为我都能想到的东西世界上这么多聪明人应该是烂大街的,但是找了一下好像没找到太多相关的信息,所以写了这篇专栏,希望能分享给更多的人。
缺点:对于高维矩阵不太合适,理论上可以用但是似乎条件比较苛刻,可能有其他开销,代码可读性下降,只建议对二维表使用。
注:
返回值是tuple,所以要修改的话建议用
[list(_)for _ in zip(*L)]