zip

1. zip函数应用示例

zip函数可以将多个可迭代对象作为参数,将对象中对应的元素打包成元组,如果可迭代对象的长度不同,则根据长度最短的那个进行打包,比如下面两个列表

lst1 = [1, 2, 3, 4, 5]
lst2 = ['一', '二', '三', '四', '五']

要求你根据这两个列表构建一个字典

{1: '一', 2: '二', 3: '三', 4: '四', 5: '五'}

如果使用普通的方法,则需要对两个列表进行遍历,示例代码如下

lst1 = [1, 2, 3, 4, 5, 6]
lst2 = ['一', '二', '三', '四', '五']

info = {}
for index, item1 in enumerate(lst1):
    if index < len(lst2):
        info[item1] = lst2[index]

print(info)

这种写法要考虑lst1的长度大于lst2长度的情况,代码看起来也算简洁,但使用zip函数可以写出更简洁的代码

lst1 = [1, 2, 3, 4, 5, 6]
lst2 = ['一', '二', '三', '四', '五']

info = {}
for item1, item2 in zip(lst1, lst2):
    info[item1] = item2

print(info)

想要更加简洁,可以使用字典推导式

lst1 = [1, 2, 3, 4, 5, 6]
lst2 = ['一', '二', '三', '四', '五']

info = {item1: item2 for item1, item2 in zip(lst1, lst2)}
print(info)

2. 自己实现zip函数

如果只是单纯的讲解zip函数的用法,也就不会放在进阶教程里了,既然已经了解了zip函数的功能,那么我们来尝试一下自己实现一个类似功能的函数。

函数接收多个可迭代对象,说明函数定义时使用了可变长参数,在python3中,zip函数不再返回列表,而是一个可迭代对象,我们自己来实现一个可迭代对象,可以使用yield关键字。下面的my_zip是我自己实现的类似zip功能的函数

lst1 = [1, 2, 3, 4, 5, 6]
lst2 = ['一', '二', '三', '四', '五']

def my_zip(*args):
    min_len = min(len(item) for item in args)       # 获得可迭代对象长度最小值
    index = 0
    while index < min_len:
        tmp_lst = [item[index] for item in args]    # 从每个可迭代对象里取出一个值
        index += 1
        yield tuple(tmp_lst)        # 返回元组

for item1, item2 in my_zip(lst1, lst2):
    print(item1, item2)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案