以前写MMA,发现转置非常好用,特别是处理表格数据,可以很方便的行列互换然后直接一个map丢上去。

虽然也可以写Map[f,list,{2}]这种样子但是可读性比较糟糕,所以还是会选择转置之后处理。

后来也用py写一些东西,发现py不像mma有那么多官方函数,网上查到的基本都是用第三方库或者干脆是暴力写,非常不美:


def


(别问我为啥缩进是两格我不知道 网上随便拉的)

还有的解决方案是直接用第三方库:


import numpy as np
np.transpose(List).tolist()


然后我也一直非常快乐的这么用下去了。后来发现不对:为啥有的时候输出结果没转成呢?

一开始非常费解,一开始的代码写的明明有问题,后来怎么老是变得啥都没干?还一点报错都没有。

后来发现问题,表头和后面长度不一样,会长出来一截,导致不是矩阵,没法转置。最后写成这样:


ret = np.transpose([ret_head[:len(ret_body[0])]] + ret_body).tolist()


非常的丑陋,后来了解了解包相关知识,又听说py3.9要改zip来增加参数可以遍历到底,才意识到我的需求可以很容易的用zip处理:

  1. 自动按顺序取出传入的各个元素
  2. 忽略多余的元素
  3. 漂亮
  4. 返回迭代器

代码:


ret = zip(ret_head, *ret_body)


以前一直是把zip当成类似MapThread之类的东西,不常用,在了解解包知识之前也完全想不到要怎么处理整个二维表,后来知道了之后又完全没考虑到这一茬,这几天才意识到可以用。

本以为我都能想到的东西世界上这么多聪明人应该是烂大街的,但是找了一下好像没找到太多相关的信息,所以写了这篇专栏,希望能分享给更多的人。

缺点:对于高维矩阵不太合适,理论上可以用但是似乎条件比较苛刻,可能有其他开销,代码可读性下降,只建议对二维表使用。

注:

返回值是tuple,所以要修改的话建议用


[list(_)for _ in zip(*L)]