我把 Python 中 zip() 函数玩出花了!
刚刚在公司茶水间还碰到隔壁组的老王,他又来问我 Python 那个 zip() 啥意思,说实话我第一反应脑子里冒出来的全是压缩包那个 zip,差点就说“你下个 7zip 啊”……不过说真的,Python 里那个 zip(),其实玩好了还真有点意思,很多场景下能整出不少花活儿。我自己写代码的时候,没事就爱乱试。
zip() 基本用法,跟做数学题似的
就先说最简单的,比如你有两个 list,一个放名字,一个放分数——就那种,项目组年终评优,名单和分数是两个表,领导还给我发了两个 excel,让我手动一行一行对着改。我当时在工位一边点外卖一边就随手敲了下面这几行:
names = ['小王', '小李', '小张']
scores = [95, 88, 79]
for name, score in zip(names, scores):
print(name, score)
你别说,这 zip 一打,直接配对,谁也不用对着 excel 扒拉,写起来真香。那会还有人喜欢用 for i in range(len(names)),说实话太土了,zip 优雅得多。
长度不一样咋办,zip 自动就给你怼短了
不过说起来,zip() 最大的“坑”其实就是长度不一样的时候——像有一次我们做需求统计,leader 发来俩 list,一个是需求名,一个是优先级,但优先级那表漏了一个,zip 一下你看,最后那条直接丢没了:
names = ['登录', '注册', '支付']
levels = ['高', '中']
for n, l in zip(names, levels):
print(n, l)
# 输出只到注册,支付直接没了
后来我想了想,这种情况还真不少,比如合并多张表,或者数据有缺漏什么的。要是想全都保留下来,其实得用 itertools.zip_longest,不过平时一般不折腾这么复杂——要么补齐,要么就认栽,哈哈。
zip(*list),这操作有点脑筋急转弯
再有一个 zip 的骚操作,就是反向用。你们有没有那种时候,二维数组要转置,搞得自己都晕了。有次加班到十点多,想把数据库里查出来的二维结果反一下,直接 zip(*data) 就行了,简直跟开挂一样:
matrix = [
[1, 2, 3],
[4, 5, 6]
]
for col in zip(*matrix):
print(col)
# 输出 (1, 4), (2, 5), (3, 6)
这个 “*” 真是魔法,用法不说没人知道,知道了天天都想用,哈哈哈。其实 zip 拆包,也就这样一层意思。
zip 还能快速做“多表连接”,真·数据工程的感觉
你们要是平时写点小工具,合并几个字段,做那种简陋的“数据同步”,zip 配合 dict 用着特别带劲。像我们搞那种字段重命名 mapping,经常写成这样:
keys = ['name', 'age', 'job']
values = ['小李', 28, '程序员']
user = dict(zip(keys, values))
print(user)
# 输出 {'name': '小李', 'age': 28, 'job': '程序员'}
领导还问我是不是现成库,结果就是 zip 打的,笑死了。
zip 还能链式骚操作,配合 map/filter 用起来飞起
别的不说,有一次写爬虫,数据要“交叉”处理,zip 直接嵌套 map,一下就整明白了。比如你要把两个 list 的对应元素相加,用 zip 配合 map,写出来跟一行诗一样:
a = [1, 2, 3]
b = [4, 5, 6]
result = list(map(lambda x: x[0] + x[1], zip(a, b)))
print(result)
# 输出 [5, 7, 9]
其实用列表推导式会更舒服:
result = [x + y for x, y in zip(a, b)]
你看,这不就更顺了嘛。
最后说一句,zip 虽然方便,但千万别乱用
有时候数据源特别长,zip 会提前截断,可能会有数据丢失的坑,尤其是你链表里有 None 或者懒加载对象,这玩意遇到 generator 跑着跑着就结束了。有次搞多线程结果合并,zip 结果全丢一半,真服了,最后还是老老实实加了长度判断。
总结…其实也没啥好总结的
说白了 zip() 这东西,就是日常开发里偷懒神器。你不管是做表格合并、数据映射,还是想把两串数据绑一块儿,zip 一下就完事了。唯一要记住的,就是别用在长度不一致的时候,或者你真在意全部数据,那就用 itertools.zip_longest。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领