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 cycle

filled_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.mfbz.cn/a/679768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「小明赠书活动」第五期“网安三剑客”套系图书《内网渗透技术》《渗透测试技术》《Web应用安全》

大模型风潮已掀起,各大巨头争相入局,从ChatGPT到Sora,全球的AI应用“卷出了花”。然而,网络安全人员在享受AI技术带来的便捷之余,也不得不面对一系列新兴的安全挑战,无法忽视。 ⭐️ 赠书 - 图书简介 人…

攻防世界---misc---Aesop_secret

1、下载附件一张动图,仔细观察发现它分成了很多小块,观察小块但是感觉又不像是二维码,可能需要把图片拼起来 2、用winhex分析,发现有一串编码,看编码的开头,猜测是AES加密 3、解码需要密码 4、想到刚刚的图…

MySQL——C语言连接数据库

MySQL Connection ​ 连接数据库的客户端除了命令行式的还有图形化界面版本,网页版本,当然也包括语言级别的库或者是包,能够帮助我们直接连接数据库; 一、语言连接库下载 方式一:不建议使用,需要自己配置…

RabbitMQ简介

一、安装和使用方式 1.https://www.erlang.org/ https://www.rabbitmq.com/ 2.先安装Erlang,管理员安装,在安装rabbitMQ,也是管理员安装,因为rabbitMQ是用Erlang语言开发的。且每个版本的RabbitMQ对应不同的Erlang版本&…

【深度学习】【机器学习】支持向量机,网络入侵检测,KDD数据集

文章目录 环境加载数据归一化数据训练模型用测试数据集给出评估指标准确率召回率预测某个输入数据随便取一行数据加载训练好的SVM支持向量机模型并预测 全部数据和代码下载 环境 之前介绍过用深度学习做入侵检测,这篇用向量机。 环境Python3.10 requirements.txt…

C++候捷stl-视频笔记3

算法的形式 Cmp通常是个比大小的准则,是Functor。 算法所需的信息通常指迭代器如何移动 迭代器的分类 array,vector,deque它们是连续的,它们的迭代器是Random Access Iterator/随机访问迭代器 list的迭代器是Bidirectional Itera…

如何微调出自己的大模型——LoRA原理解析

1、前言 上一篇文章,我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型,参数量及其之大。你没有足够的算力资源,就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型,那我们就想,是…

小索引大力量,记一次explain的性能优化经历

在 MySQL 的生产环境中,性能问题是一个常见的挑战。当数据库查询响应时间变慢,或者系统资源消耗异常时,我们需要快速定位问题并进行优化。MySQL 提供了一个强大的工具——EXPLAIN,它可以帮助我们分析查询语句的执行计划&#xff0…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

读书笔记-Java并发编程的艺术-第2章 Java并发机制的底层实现原理

文章目录 2.1 volatile的应用2.1.1 volatile的定义与实现原理2.1.2 volatile的使用优化 2.2 synchronized的实现原理与应用2.2.1 Java对象头2.2.2 锁的升级与对比2.2.2.1 偏向锁2.2.2.2 轻量级锁2.2.2.3 锁的优缺点对比 2.3 原子操作的实现原理2.3.1 术语定义2.3.2 处理器如何实…

Linux 内存管理 SLUB 分配器

文章目录 前言一、SLUB allocator二、SLUB core参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/229984/ [Posted April 11, 2007 by corbet]SLAB分配器是用于处理“频繁分配和释放的对象”的对象缓存内核内存分配器。它是内存管理子系统中关键的一部分&#xf…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

MySQL之查询性能优化(三)

查询性能优化 重构查询的方式 在优化有问题的查询时&#xff0c;目标应该是找到一个更优的方法获得实际需要的记过——而不是一定总是需要从MySQL获取一模一样的结果集。有时候&#xff0c;可以将查询转换一种写法让其返回一样的结果&#xff0c;但是性能更好。但也可以通过修…

关于URL获取的参数,无法执行二选一查询

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C++之noexcept

目录 1.概述 2.noexcept作为说明符 3.noexcept作为运算符 4.传统throw与noexcept比较 5.原理剖析 6.总结 1.概述 在C中&#xff0c;noexcept是一个关键字&#xff0c;用于指定函数不会抛出异常。如果函数保证不会抛出异常&#xff0c;编译器可以进行更多优化&#xff0c;…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

JDK8安装详细教程教程-windows

&#x1f4d6;JDK8安装详细教程教程-windows ✅1. 下载✅2. 安装 ✅1. 下载 123云盘下载地址&#xff1a; JDK8 | JDK11 | JDK17 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ ✅2. 安装 运行jdk-8u211-windows-x64.exe安装包文…

Blog项目切换Markdown编辑器———LayUI弹出层弹出写在页面的内容导致的各种bug

【2024.5.24回顾】 1 问题描述(描述完自己解决了…) 正常情况 点击添加文章按钮后&#xff0c;弹出文章编辑界面&#xff0c;如果用富文本功能编辑&#xff0c;则一切正常。可以多次打开、关闭 Markdown 如果在弹出层中点击了切换编辑器按钮&#xff0c;会成功切换为markd…

FreeRTOS的使用与编码器设计

第一步&#xff1a;任务创建&#xff1a;在 FreeRTOS 中&#xff0c;系统功能由任务&#xff08;Task&#xff09;组成。在系统启动时&#xff0c;你需要创建各个任务并指定它们的任务频率、优先级、堆栈大小等参数。 xTaskCreate() 来创建开始任务并定义任务的执行函数、优先级…