Python-3.12.0文档解读-内置函数zip()详细说明+记忆策略+常用场景+巧妙用法+综合技巧


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

详细说明

基本用法

示例

特性

高级用法

注意事项

版本更新

示例代码

记忆策略

常用场景

同时迭代两个或更多序列:

将键和值列表组合成字典:

矩阵的转置:

将数据分组:

巧妙用法

1. 使用 zip() 进行字典键值互换

2. 使用 zip() 进行多列排序

3. 使用 zip() 进行数据填充

4. 使用 zip() 进行数据分块

综合技巧

1. 结合 enumerate() 和 zip() 进行多序列迭代

2. 结合 map() 和 zip() 进行并行操作

3. 结合 filter() 和 zip() 进行条件筛选

4. 结合 sorted() 和 zip() 进行多条件排序

5. 结合 itertools.cycle() 和 zip() 进行无限循环迭代


详细说明

zip() 是 Python 中的一个内置函数,用于将多个可迭代对象(如列表、元组等)并行地组合成一个元组的迭代器。这个函数特别适用于需要同时遍历多个序列的场景。

基本用法

zip() 函数的基本语法如下:

python复制

zip(*iterables, strict=False)

  • *iterables:一个或多个可迭代对象,如列表、元组等。
  • strict:一个布尔值,默认为 False。如果设置为 True,则要求所有输入的可迭代对象长度必须相同,否则会抛出 ValueError。
示例
for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):print(item)

输出:

(1,'sugar')

(2, 'spice')

(3, 'everything nice')

特性
  1. 延迟执行:zip() 函数是惰性的,即在迭代时才会生成元组。
  2. 长度不一致的处理:
  • 默认情况下,zip() 会在最短的可迭代对象耗尽时停止,忽略其他对象中剩余的元素。
  • 如果设置了 strict=True,则要求所有可迭代对象长度必须相同,否则会抛出 ValueError。
高级用法
  1. 矩阵转置:zip() 可以用于实现矩阵的转置,即将行转换为列,列转换为行。
  2. 数据分组:通过 zip(*[iter(s)]*n, strict=True) 可以将一个序列按固定长度 n 分组。
  3. 解压缩列表:使用 * 运算符可以解压缩由 zip() 创建的列表。
注意事项
  • 当使用 strict=True 时,必须确保所有输入的可迭代对象长度一致,否则程序会抛出异常。
  • 如果需要处理长度不一致的可迭代对象,并且希望用默认值填充较短的序列,可以使用 itertools.zip_longest() 函数。
版本更新
  • strict 参数是在 Python 3.10 版本中新增的,用于增强对可迭代对象长度不一致情况的处理。
示例代码
# 默认行为
list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))  # 输出: [(0, 'fee'), (1, 'fi'), (2, 'fo')]# 使用 strict=True
list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))  # 输出: [('a', 1), ('b', 2), ('c', 3)]# 解压缩列表
x = [1, 2, 3]
y = [4, 5, 6]
x2, y2 = zip(*zip(x, y))
print(x == list(x2) and y == list(y2))  # 输出: True

记忆策略

关联记忆法

将 zip() 函数的名称与其功能进行关联。想象 zip 这个词在日常生活中的含义,即用于将两个边缘紧密结合在一起的拉链或扣件。在编程中,zip() 函数的作用是将两个或多个序列“拉”在一起,形成一系列的配对,就像拉链一样将它们紧密结合。


常用场景

zip()函数在Python中有许多有用的应用场景,以下是其中的一些例子:


同时迭代两个或更多序列:

# 创建两个列表
list1 = ['apple', 'banana', 'cherry']
list2 = ['fruit', 'fruit', 'fruit']# 使用zip()函数将两个列表组合
for a, b in zip(list1, list2):print(a, b)  # 输出: 'apple fruit', 'banana fruit', 'cherry fruit'


将键和值列表组合成字典:

# 创建两个列表,一个用于字典的键,另一个用于字典的值
keys = ['name', 'age', 'job']
values = ['John', 25, 'Developer']# 使用zip()函数将两个列表组合成一个字典
dictionary = dict(zip(keys, values))
print(dictionary)  # 输出:{'name': 'John', 'age': 25, 'job': 'Developer'}


矩阵的转置:

# 创建一个2x3的矩阵
matrix = [[1, 2, 3], [4, 5, 6]]# 使用zip()函数和*运算符进行矩阵的转置
transposed = list(zip(*matrix))
print(transposed)  # 输出:[(1, 4), (2, 5), (3, 6)]


将数据分组:

# 创建一个数据序列
data = [1, 2, 3, 4, 5, 6]# 使用zip()函数将数据按长度2进行分组
grouped_data = list(zip(*[iter(data)]*2))
print(grouped_data)  # 输出:[(1, 2), (3, 4), (5, 6)]

以上就是zip()函数的一些常用场景,这个函数的灵活性使得它在各种需要将元素配对的场景中都非常有用。


巧妙用法

zip() 函数确实有一些巧妙的使用技巧,这些技巧可能不是一眼就能看出来的,但在特定的编程场景中非常有用。以下是一些不太常见但十分巧妙的使用技巧:

1. 使用 zip() 进行字典键值互换

有时候,你可能需要将字典的键和值互换。虽然 Python 3.7+ 提供了 dict.items() 方法和字典推导式来实现这一点,但使用 zip() 可以实现相同的效果,且代码简洁:

# 原始字典
original_dict = {'a': 1, 'b': 2, 'c': 3}# 使用 zip() 进行键值互换
flipped_dict = dict(zip(original_dict.values(), original_dict.keys()))
print(flipped_dict)  # 输出:{1: 'a', 2: 'b', 3: 'c'}

2. 使用 zip() 进行多列排序

如果你需要对一个列表进行多列排序,可以使用 zip() 结合 sorted() 函数来实现:

# 创建一个包含姓名和分数的列表
students = [('John', 88), ('Jane', 92), ('Doe', 78), ('Smith', 85)]# 首先按分数排序,分数相同则按姓名排序
sorted_students = sorted(students, key=lambda student: (student[1], student[0]))# 使用 zip() 来简化排序键的构造
sorted_students = sorted(students, key=lambda student: list(zip(*sorted_students)[1], sorted_students[0]))
print(sorted_students)  # 输出:[('Doe', 78), ('Smith', 85), ('John', 88), ('Jane', 92)]

3. 使用 zip() 进行数据填充

在处理数据时,有时需要将一个序列填充到与另一个序列相同的长度。虽然 itertools.zip_longest() 是更常见的选择,但 zip() 也可以通过一些技巧来实现:

# 创建两个长度不同的列表
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c', 'd', 'e']# 使用 zip() 和 itertools.cycle() 来填充 list1 到与 list2 相同的长度
from itertools import cyclefilled_list1 = list(next(cycle(list1)) for _ in range(len(list2)))# 现在使用 zip() 来配对填充后的 list1 和 list2
zipped_pairs = list(zip(filled_list1, list2))
print(zipped_pairs)  # 输出:[(1, 'a'), (2, 'b'), (3, 'c'), (1, 'd'), (2, 'e')]

4. 使用 zip() 进行数据分块

有时候,你可能需要将一个序列分成固定大小的块。虽然 itertools.islice() 和 zip() 的组合可以实现这一点,但使用 zip() 和 iter() 的组合更为简洁:

# 创建一个序列
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]# 使用 zip() 将数据分成每块大小为 3
chunks = list(zip(*[iter(data)]*3))
print(chunks)  # 输出:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

这些技巧展示了 zip() 函数的灵活性和强大功能,尽管它们可能不是日常编程中最常用的,但在特定情况下,它们可以大大简化代码并提高效率。


综合技巧

zip() 函数与 Python 中的其他函数和方法结合使用时,可以产生一些非常巧妙且高效的操作。以下是一些结合 zip() 使用的巧妙用法:

1. 结合 enumerate() 和 zip() 进行多序列迭代

当你需要同时迭代多个序列,并且还需要每个元素的索引时,可以结合使用 enumerate() 和 zip():

# 创建两个列表
list1 = ['a', 'b', 'c']
list2 = [1, 2, 3]# 使用 zip() 和 enumerate() 同时获取索引和元素
for index, (a, b) in enumerate(zip(list1, list2)):print(f"Index: {index}, List1: {a}, List2: {b}")

2. 结合 map() 和 zip() 进行并行操作

使用 map() 和 zip() 可以对多个序列的对应元素执行相同的操作:

# 创建两个列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]# 使用 zip() 和 map() 计算每个对应元素的和
sums = list(map(lambda x: x[0] + x[1], zip(list1, list2)))
print(sums)  # 输出:[5, 7, 9]

3. 结合 filter() 和 zip() 进行条件筛选

结合 filter() 和 zip() 可以对多个序列的对应元素进行条件筛选:

# 创建两个列表
list1 = [1, 2, 3, 4, 5]
list2 = [2, 3, 4, 5, 6]# 使用 zip() 和 filter() 筛选出 list1 中大于 list2 对应元素的元素
filtered = list(filter(lambda x: x[0] > x[1], zip(list1, list2)))
print(filtered)  # 输出:[(5, 4)]

4. 结合 sorted() 和 zip() 进行多条件排序

使用 sorted() 和 zip() 可以对序列进行多条件排序:

# 创建一个包含姓名和分数的列表
students = [('John', 88), ('Jane', 92), ('Doe', 78), ('Smith', 85)]# 使用 zip() 和 sorted() 按分数降序排序,分数相同则按姓名升序排序
sorted_students = sorted(students, key=lambda student: (-student[1], student[0]))# 使用 zip() 来简化排序键的构造
sorted_students = sorted(students, key=lambda student: list(zip(*sorted_students)[1], sorted_students[0]))
print(sorted_students)  # 输出:[('Doe', 78), ('Smith', 85), ('John', 88), ('Jane', 92)]

5. 结合 itertools.cycle() 和 zip() 进行无限循环迭代

使用 itertools.cycle() 和 zip() 可以创建一个无限循环迭代器:

from itertools import cycle# 创建一个列表
colors = ['red', 'green', 'blue']# 使用 cycle() 和 zip() 创建一个无限循环迭代器
for i, color in zip(range(10), cycle(colors)):print(f"Iteration {i}: {color}")

这些结合使用 zip() 的技巧展示了其在处理序列和迭代时的强大功能和灵活性。通过巧妙地组合不同的函数和方法,可以实现复杂的数据操作和处理。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI的学习(一)

UI的学习(一) 文章目录 UI的学习(一)UIlabelUIButtonUIButton的两种形式UIButton的事件触发 UIView多个视图之间的关系 UIWindowUIViewController一个视图推出另一个视图 定时器和视图移动UISwitchUISlider和UIProgressSlid步进器与分栏控制器UITextFieldUIScrollView有关实现它…

个人笔记-随意记录

常见问题? 1.linux重启服务 端口被占用如何解决? 查看某个端口被占用的进程 netstat -tulnp | grep :23454 强制杀死进程 kill -9 1776 重启服务即可

ant design form表单动态增减表单项Form.List选中Select值后更新相关联Select选项

ant design form表单动态增减表单项Form.List选中Select值后更新相关联Select选项。代码中地市联动获取区县数据&#xff1a; <Form name"dynamic_form_nest_item" onFinish{onFinish} autoComplete"off" form{form} initialValues{{ list: [{}] }} &…

Codeforces Round 949 (Div. 2) C. Turtle and an Incomplete Sequence 题解 构造

Turtle and an Incomplete Sequence 题目描述 Turtle was playing with a sequence a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​ consisting of positive integers. Unfortunately, some of the integers went missing while playing. Now the sequence…

解决Chat打开时Unable to load conversation 的问题

在开梯子的情况下打开chat依然很卡&#xff0c;这里选择edge的浏览器无痕模式&#xff08;新建InPrivate窗口&#xff09;&#xff0c;在无痕窗口下打开chat就可以了。

python ---requests

python包管理工具 pip 若发现报错&#xff0c;则可以通过 -i 命令指定软件源 requests库安装 通过 pip &#xff0c;如上 或通过 pycharm 搜索 requests &#xff0c;并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…

Redis 集群:主从复制配置指南

Redis 主从集群配置 首先&#xff0c;确保你的系统上已安装 Redis。接下来&#xff0c;我们将配置一个简单的 Redis 主从集群。 1. 配置主节点 编辑主节点的 redis.conf 文件&#xff0c;通常位于 /etc/redis/ 目录下。配置持久化和密码&#xff08;如果需要&#xff09;&am…

SpringMVC:消息转换器

1. HttpMessageConvertor 简介 HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为&#xff1a;HTTP消息转换器。该接口下提供了很多实现类&#xff0c;不同的实现类有不同的转换方式。 转换器 如上图所示&#xff1a;HttpMessageConverter接口的可以将请求协议转…

基于ESP32-S3芯片的通用型无线模组方案,启明云端乐鑫一级代理商

随着物联网技术的飞速发展&#xff0c;智能设备正以前所未有的速度进入到我们的日常生活中&#xff0c;AIoT&#xff08;人工智能物联网&#xff09;已成为智能家居、智能设备、智能安防等领域的核心技术。 作为乐鑫一级代理商&#xff0c;基于ESP32-S3芯片&#xff0c;启明云…

科技云报道:走出“实验室”,GenAI迎来关键拐点

科技云报道原创。 对传统产业来说&#xff0c;GenAI是一场“哥白尼式的革命”&#xff0c;它改变了传统的业务模式&#xff0c;开启了人类与AI合作的新纪元。基于AI助手和大语言模型&#xff0c;企业能够实现智能运营的目标。 如果说&#xff0c;2022年是AI大模型元年&#x…

【全开源】Java AI绘画MJ绘画源码小程序APP公众号源码AI绘图

&#x1f3a8; 探索AI绘画的奥秘 一、引言&#xff1a;AI绘画的魅力 &#x1f308; 在这个数字化飞速发展的时代&#xff0c;AI绘画已经不再是遥不可及的梦想。通过源码小程序&#xff0c;我们可以轻松探索AI绘画的奥秘&#xff0c;感受科技与艺术的完美结合。今天&#xff0…

电脑误删除文件如何恢复?几种常用的数据恢复方法分享!

处理电脑文件时误删是大部分电脑用户可能都会面临的一个问题。如果是比较重要的文件&#xff0c;很多用户就会开始心慌&#xff0c;不知道如何是好。那么&#xff0c;电脑怎么恢复删除的文件呢&#xff1f; 其实方法很简单&#xff0c;下面小编就给大家分享几种常用的数据恢复方…

react-学习基础偏

1.新建文件夹 2.vscode引入这个文件夹 3.打开vscode终端 执行命令 npx create-react-app react-basic 创建基本项目&#xff08;react-basic项目文件夹名&#xff09; 4.进入到这个文件夹 可用的一些命令 这就算启动成功 5. 这是项目的核心包 渲染流程

BLE芯片DA145XX系列:HOGP功能实现

DA145XX协议芯片支持配置HOGP功能。即模拟蓝牙键鼠之类的设备&#xff0c;实现和手机绑定后&#xff0c;靠近设备手机自动回连设备的功能。实现HOGP功能需要对默认SDK做特殊配置&#xff0c;具体流程如下&#xff1a;1、配置宏定义 da1458x_config_basic.h文件&#xff1a; /*…

java自学阶段二:JavaWeb开发06(mybatis学习)

目录&#xff1a; 学习目标mybatis的基础用法&#xff08;新增、删除、修改、查询&#xff09; 一&#xff1a;学习目标&#xff1a; 1&#xff09;了解mybatis的基础概念&#xff1b; 2&#xff09;学会mybatis的基础用法&#xff1b; 二、mybatis的基础概念&#xff1a; M…

手把手教你改进YOLOv8小目标检测(多尺度特征融合iAFF)

1,YOLOv8改进策略指南 YOLOv8是目标检测领域中一个重要的模型,它在YOLO系列的基础上进行了进一步的改进和优化。 根据搜索结果,YOLOv8的一些改进策略包括: 注意力机制的增加:通过引入注意力机制,可以提高模型对目标特征的捕捉能力,从而提升检测性能2369。 卷积和Block的…

Unity Obi Rope失效

文章目录 前言一、WebGL端Obi Rope失效二、Obi Rope 固定不牢三、使用Obi后卡顿总结 前言 Obi 是一款基于粒子的高级物理引擎&#xff0c;可模拟各种可变形材料的行为。 使用 Obi Rope&#xff0c;你可以在几秒内创建绳索和杆子&#xff0c;同时完全控制它们的形状和行为&…

scipy.io.loadmat加载.mat文件,出现KeyError: ‘xxx‘

源代码&#xff1a; input_image loadmat(rC:\Users\admin\Downloads\Indian_Pines\SVM/aa.mat)[aa] #影像图 错误显示&#xff1a; 解决方法&#xff1a; 因为loadmat函数读取出来的高光谱数据是dict格式的所以需要定位才能进行后续操作&#xff0c;定位通常是通过列名&a…

运筹说 第116期 | 算法介绍之排队论

在这个快节奏的时代&#xff0c;无论是线上购物、线下服务&#xff0c;还是工业生产&#xff0c;我们都不可避免地与“排队”打交道。今天小编将带你一起探索利用Python和MATLAB这两种编程工具&#xff0c;来求解排队论中的常见模型和排队优化问题。我们将从排队论的基础模型开…

U盘杀毒是否会导致文件丢失?误删文件如何恢复?

在数字化时代&#xff0c;U盘作为便携的数据存储设备&#xff0c;广泛应用于我们的日常生活与工作中。然而&#xff0c;随着网络环境的复杂化&#xff0c;U盘也时常成为病毒传播的媒介。因此&#xff0c;对U盘进行杀毒成为保护数据安全的重要步骤。但许多用户担心&#xff0c;给…