Python中使用zip函数的七重境界解析

 更新时间:2022年12月26日 10:47:33   作者:赵卓不凡  
这篇文章主要介绍了Python中使用zip函数的七重境界,重点介绍了Python中功能强大的zip 函数的多种用法,并给出了相应的代码示例,需要的朋友可以参考下

1. 引言

Python中有一些内置函数,可以使我们的代码非常优雅。zip 函数就是其中之一,但是zip 函数的使用对于初学者来说不是很直观,有时容易出错。因此本文将从7个层次来由浅入深地来探讨强大的zip 函数的概念、用法和技巧。
闲话少说,我们直接开始吧!

2. Level 0: 了解zip函数基础语法

zip 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的iterator
举例如下,我们可以使用它以如下方式来组合两个列表,样例代码如下:

id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li']
record = zip(id, leaders)

print(record)
# <zip object at 0x7f266a707d80>

print(list(record))
# [(1, 'Elon Mask'), (2, 'Tim Cook'), (3, 'Bill Gates'), (4, 'Bai Li')]

如上面的示例所示,zip 函数返回一个元组迭代器,其中第i 个元组包含每个列表中的第i 个元素。

3. Level 1: zip函数同时处理多个对象

事实上,Python中的zip 函数具有强大的功能,比如它可以一次处理任意数量的可迭代项,而不仅仅是两个。

首先,我们来看如果我们将一个list 传递给 zip 函数,样例如下:

id = [1, 2, 3, 4]
record = zip(id)
print(list(record))
# [(1,), (2,), (3,), (4,)]

如果我们同时传递三个list ,结果如下:

id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li']
sex = ['m', 'm', 'm', 'm']
record = zip(id, leaders, sex)

print(list(record))
# [(1, 'Elon Mask', 'm'), (2, 'Tim Cook', 'm'), (3, 'Bill Gates', 'm'), (4, 'Bai Li', 'm')]

如上所述,无论我们传递给zip函数多少个可迭代项,它都能按照我们的预期来正常工作。
顺便说一下,如果没有参数,zip 函数只返回一个空的迭代器。

4. Level 2: zip函数处理长度不等的参数

真实数据并不总是干净和完整的,有时我们必须处理不等长的可迭代数据。默认情况下,zip函数的结果基于最短的可迭代项。
举例如下:

id = [1, 2]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li']
record = zip(id, leaders)

print(list(record))
# [(1, 'Elon Mask'), (2, 'Tim Cook')]

如上面的代码所示,最短的列表是id ,因此record 只包含两个元组,并且忽略了列表leaders 中的最后两个元素。
如果最后两位leader 因被忽视而不高兴,我们该怎么办?
Python将再次帮助我们。itertools 模块中还有一个名为zip_langest 的函数。顾名思义,它是zip函数的兄弟,其结果基于最长的参数。
我们不妨使用zip_langest 函数来生成上述record列表,结果如下:

from itertools import zip_longest
id = [1, 2]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li']

long_record = zip_longest(id, leaders)
print(list(long_record))
# [(1, 'Elon Mask'), (2, 'Tim Cook'), (None, 'Bill Gates'), (None, 'Bai Li')]

long_record_2 = zip_longest(id, leaders, fillvalue='Top')
print(list(long_record_2))
# [(1, 'Elon Mask'), (2, 'Tim Cook'), ('Top', 'Bill Gates'), ('Top', 'Bai Li')]

如上所述,zip_langest 函数基于其最长参数来返回结果。可选的fillvalue 参数(默认值为None )可以帮助我们填充缺失的值。

5. Level 3: 掌握unzip操作

在上一个示例中,如果我们首先获得列表record ,那么我们如何将其unzip 解压缩为单独的可迭代项?
不幸的是,Python并没有直接的解压缩unzip 函数。然而,如果我们熟悉星号* 的技巧,解压缩将是一项非常简单的任务。

record = [(1, 'Elon Mask'), (2, 'Tim Cook'), (3, 'Bill Gates'), (4, 'Bai Li')]
id, leaders = zip(*record)
print(id)
# (1, 2, 3, 4)
print(leaders)
# ('Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li')

在上面的示例中,星号执行了拆包操作,即从记录列表中拆包所有四个元组。

6. Level 4: 通过zip函数创建和更新dict

受益于功能强大的zip 函数,基于一些独立的列表来创建和更新dict 将非常方便。
我们可以使用以下one-line的方案:
● 使用字典生成式和zip函数
● 使用dict和zip函数
样例代码如下:

id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li']

# create dict by dict comprehension
leader_dict = {i: name for i, name in zip(id, leaders)}
print(leader_dict)
# {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4:'Bai Li'}

# create dict by dict function
leader_dict_2 = dict(zip(id, leaders))
print(leader_dict_2)
# {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4: 'Bai Li'}

# update
other_id = [5, 6]
other_leaders = ['Larry Page', 'Sergey Brin']
leader_dict.update(zip(other_id, other_leaders))
print(leader_dict)
# {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4: ''Bai Li'', 5: 'Larry Page', 6: 'Sergey Brin'}

上面的示例根本不使用for 循环 , 这是多么的优雅和Pythonic

7. Level 5: 在for循环中使用zip函数

同时处理多个可迭代项通常是常见的场景, 此时我们可以在for循环中配合使用函数zip ,这也是我最喜欢函数zip 的用法之一。
举例如下:

products = ["cherry", "strawberry", "banana"]
price = [2.5, 3, 5]
cost = [1, 1.5, 2]
for prod, p, c in zip(products, price, cost):
    print(f'The profit of a box of {prod} is £{p-c}!')
# The profit of a box of cherry is £1.5!
# The profit of a box of strawberry is £1.5!
# The profit of a box of banana is £3!

8. Level 6: 实现矩阵转置

我们来看以下问题:

如何优雅地实现矩阵的转置操作?

Wow, 鉴于在上文中我们已经介绍了函数zip ,星号* ,以及列表生成式,所以one-line 的实现方式如下:

matrix = [[1, 2, 3], [1, 2, 3]]
matrix_T = [list(i) for i in zip(*matrix)]
print(matrix_T)
# [[1, 1], [2, 2], [3, 3]]

9. 总结

本文重点介绍了Python中功能强大的zip 函数的多种用法,并给出了相应的代码示例。

到此这篇关于Python中使用zip函数的七重境界的文章就介绍到这了,更多相关Python中使用zip函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 磁盘垃圾文件清理器python代码实现

    磁盘垃圾文件清理器python代码实现

    几行Python代码打造自己的磁盘垃圾文件清理器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python常见读取语音的3种方法速度对比

    python常见读取语音的3种方法速度对比

    python已经支持WAV格式的书写,下面这篇文章主要给大家介绍了关于python常见读取语音的3种方法速度对比的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 一文带你了解Python与svg之间的操作

    一文带你了解Python与svg之间的操作

    svgwrite是一个 Python 库,用于生成简单的 SVG 图片。它提供了一组类似于绘图的 API,使用者可以在 SVG 画布上画线、矩形、圆等图形。本文主要介绍了如何利用svgwrite进行SVG图片的操作,需要的可以参考一下
    2023-01-01
  • python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法

    python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法

    今天小编就为大家分享一篇python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 使用python如何实现泛型函数

    使用python如何实现泛型函数

    这篇文章主要介绍了使用python如何实现泛型函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Python3简单爬虫抓取网页图片代码实例

    Python3简单爬虫抓取网页图片代码实例

    这篇文章主要介绍了Python3简单爬虫抓取网页图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python中import reload __import__的区别详解

    python中import reload __import__的区别详解

    这篇文章主要介绍了python中import reload __import__的区别详解,需要的朋友可以参考下
    2017-10-10
  • Python去除图片水印实现方法详解

    Python去除图片水印实现方法详解

    这篇文章主要为大家详细介绍了如何利用Python实现处理图片水印的相关资料,主要是实现图片水印的去除效果,感兴趣的小伙伴可以尝试一下
    2023-01-01
  • 关于Torch torchvision Python版本对应关系说明

    关于Torch torchvision Python版本对应关系说明

    这篇文章主要介绍了关于Torch torchvision Python版本对应关系说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 解决pycharm无法调用pip安装的包问题

    解决pycharm无法调用pip安装的包问题

    今天小编就为大家分享一篇解决pycharm无法调用pip安装的包问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论