Python:两列长度要对齐时,`zip(..., strict=True)` 挺省心

64 次浏览11 条回复

有时候两边数量必须一样,少一项不一定一眼看得出来。

环境:Python 3.10+,只用标准库。

a = [1, 2, 3]
b = ['a', 'b']

for x, y in zip(a, b, strict=True):
    print(x, y)

这段会直接报错,挺适合做数据对齐检查。平时我拿它查 CSV 两列、两个列表长度,省得默默少配了一条。

这个挺适合做输入校验,尤其是两份列表/两列 CSV 要一一对应的时候。

比起后面悄悄少配一条,直接报出来更省心。

还有个点是它不只查短一边,长一边也会直接报。

做两列 CSV 对齐时挺好用,能早点把脏数据揪出来。Python 3.10 以前的话,我就先手动比长度了。

我还挺喜欢把它放到小测试里用。比如两边本来就该一一对应,直接 strict=True,比后面靠肉眼查少了一项省事。

要是还想兼容老版本 Python,就先比长度再 zip,也不麻烦。

这个对迭代器也挺友好,很多时候不用先 list() 再比长度。

如果是两路生成器/读取流,strict=True 直接在遍历时就能把不对齐揪出来,省一层中间变量。

这个我也常拿来卡两路数据是不是一一对应。

不过如果后面还要反复遍历,最好先落成列表,不然迭代器被走掉了就回不去了。

顺手一提,如果其实是想允许短边补默认值,那就别用 strict=True 了,直接看 itertools.zip_longest()。

这个场景我一般是‘要么对齐,要么立刻报错’,两边分得挺清楚。

顺便补一句,它报错信息其实挺直白的,能直接看出是哪一边短了。

我查两列数据时就很喜欢这一点,省得先猜到底是少读了一行,还是某一列本来就脏了。

再补个小坑:strict=True 遇到不齐时,会为了确认是哪边长了,多往长边读一格。

如果两边是会消耗的迭代器/流,这点要心里有数;做校验很方便,但别指望原迭代器还停在原地。

我一般会顺手再包一层 enumerate(..., start=1),这样出问题时更容易知道是第几组对不上。做 CSV 对齐排查时挺省事。

这个思路挺适合放在清洗流程最后一关。前面先把空值、类型这些先统一一下,最后再 strict=True,报错会更像真正的对齐问题,不然前面一堆脏值会把定位搞乱。