【python】zip 介绍和例子

本文详细介绍了 Python 的内置函数 `zip`,解释了它的作用和工作原理,通过多个实例展示了如何使用 `zip` 合并列表、创建字典以及处理不同长度的可迭代对象。此外,还提到了 `zip` 在将可迭代对象转化为字典的应用。

介绍

压缩文本行

在 Python 教程的这一章中,我们将讨论美妙且极其有用的功能“zip”。不幸的是,Python 的初学者经常被 zip 不必要地混淆和害怕。首先这个名字很混乱。许多人将 Python 的 zip 与众所周知的存档文件格式 ZIP 混淆,后者用于无损数据压缩。由于这种数据压缩不仅使所需的存储空间非常小,而且执行速度也非常快,因此选择了名称“zip”。在这种情况下,“zip”的意思是“迅速行动或迅速行动”。

Python 的“zip”与它完全无关。Python 中的 'zip' 功能基于英文单词 'zip' 的另一个含义,“用拉链关闭某物”。

我们将看到 zip 非常容易理解。但是,如果您想出使用 Python 帮助功能的想法,这将不适用。帮助文本肯定对此负有部分责任,并吓跑了新手:

Return a zip object whose .next() method returns a tuple where the i-th element comes from the i-th iterable argument. The .next() method continues until the shortest iterable in the argument sequence is exhausted and then it raises StopIteration.

这段文字是正确的,但很难理解。在我们尝试简化 zip 背后的理论之前,让我们从简单的例子开始。

我们将从两个列表开始并将 zip 应用到这两个列表:

a_couple_of_letters  =  [ "a" ,  "b" ,  "c" ,  "d" ,  "e" ,  "f" ] 
some_numbers  =  [ 5 ,  3 ,  7 ,  9 ,  11 ,  2 ] 
print ( zip ( a_couple_of_letters ,  some_numbers ) )

输出:

<zip 对象位于 0x7efc8724f9b0>

结果是一个 zip 对象,如果您不了解 zip,那么您并不比以前更聪明。zip 的应用程序返回一个迭代器,它能够生成元组。它将每个可迭代对象(在我们的示例列表中)的第一项组合成一个元组,然后再组合第二项,依此类推。当其中之一用完时它会停止,即没有更多可用的项目。

查看它创建的内容的最佳方法是在 for 循环中使用它。

对于 t  in  zip ( a_couple_of_letters ,  some_numbers ):
    打印( t )

输出:

('a', 5)
('b', 3)
('c', 7)
('d', 9)
('e', 11)
('f', 2)

如果你仔细观察上面的输出和下面的图片,你就会明白为什么 zip 与拉链有关,以及为什么他们选择了这个名字。

在拉链上映射两个列表

zip 可以有任意数量的可迭代参数,如下例所示:

位置 =  [ “赫尔戈兰” “基尔” “柏林特格尔” “康斯坦茨” “霍恩派森贝格” ] 
air_pressure  =  [ 1021.2 , 1019.9 , 1023.7 , 1023.1 , 1027.7 ]
温度 =  [ 6.0 , 4.3 , 2.7 , - 1.4 , - 4.4 ]
海拔 =  [ 4 ,  27 ,  37 ,  443 , 977 ]
对于 t  in  zip (位置、 气压、 温度、 海拔):
    打印(t )

输出:

('黑尔戈兰', 1021.2, 6.0, 4)
('基尔', 1019.9, 4.3, 27)
('柏林-泰格尔', 1023.7, 2.7, 37)
('康斯坦茨', 1023.1, -1.4, 443)
('Hohenpeißenberg', 1027.7, -4.4, 977)

zip 的使用不仅限于列表和元组。它可以应用于所有可迭代对象,如列表、元组、字符串、字典、集合、范围等等。

食品 =  [ “火腿” “垃圾邮件” “奶酪” ]
 项目  拉链范围(1000 , 1003 ), 食物):
    打印(项)

输出:

(1000,'火腿')
(1001, '垃圾邮件')
(1002, '奶酪')

不带参数调用 zip

让我们看看如果我们不带任何参数调用 zip 会发生什么:

for  i  in  zip ():
    打印“这不会被打印” 

循环体没有被执行!

使用 One Iterable 调用 zip

如果我们只用一个参数调用 zip 会发生什么,例如一个字符串:

s  =  "Python" 
for  t  in  zip ( s ):
    打印( t )

输出:

('P',)
('y',)
('t',)
('H',)
('o',)
('n',)

所以这个调用创建了一个迭代器,它产生一个带有一个元素的元组,在我们的例子中是字符串的字符。

不同长度的参数

正如我们所见,可以使用任意数量的可迭代对象作为参数调用 zip。到目前为止,元素的数量或这些可迭代对象的长度是相同的。这是没有必要的。如果长度不同,则 zip 将在参数序列之一用完后立即停止生成输出。“停止产生输出”实际上意味着它会像所有其他迭代器一样引发 StopIteration 异常。这个异常被 for 循环捕获。您将在Python 教程的“迭代器和可迭代对象”一章中找到有关这种工作方式的更多信息。

以下示例是具有两个不同长度的列表的 zip 调用:

颜色 =  [ “绿色” “红” “蓝” ]
汽车 =  [ “宝马” “阿尔法·罗密欧” ]
 车, 颜色  拉链(汽车, 颜色):
    打印(车, 颜色)

输出:

宝马绿色
阿尔法罗密欧红

zip 的高级用法

我们有一份瑞士六个最大城市的清单。它由包含对、城市和人口数的元组组成:

cities_and_population  =  [( “苏黎世” , 415367 ), (
                         “日内瓦” , 201818 ), (
                         “巴塞尔” , 177654 ), (
                         “洛桑” , 139111 ), (
                         “伯尔尼” , 133883 ), (
                         “温特图尔” , 111851 ) ]

该任务包括创建两个列表:一个是城市名称,一个是人口数量。zip 是这个问题的解决方案,但我们还必须使用星号运算符来解压列表:

城市, 人口 = 名单ZIP * cities_and_population ))
印刷(市)
印刷(群)

输出:

(“苏黎世”、“日内瓦”、“巴塞尔”、“洛桑”、“伯尔尼”、“温特图尔”)
(415367, 201818, 177654, 139111, 133883, 111851)

这是需要的,例如,如果我们想绘制这些数据。以下示例仅用于说明目的。没有必要完全理解它。你必须熟悉Pandas。在下面的程序中,我们假设开始时只有组合列表可用:

进口 熊猫 作为 PD 
cities_and_population  =  [( “苏黎世” , 415367 ), (
                         “日内瓦” , 201818 ), (
                         “巴塞尔” , 177654 ), (
                         “洛桑” , 139111 ), (
                         “伯尔尼” , 133883 ), 
                         (“温特图尔" ,  111851 )]
城市, 人口 = 列表( zip ( * city_and_population )) 
s  =  pd. 系列(人口, 指数=城市)
s 情节(种类= “酒吧” 

将两个可迭代对象转换为字典

zip 还为我们提供了将两个可迭代对象转换为字典的绝佳机会。当然,前提是这些可迭代对象满足某些要求。应该用作键的可迭代对象必须是唯一的,并且只能由不可变对象组成。我们用以下莫尔斯电码示例演示了这一点。完整的摩尔斯电码字母表可以在我们关于字典的章节中找到:

abc  =  "abcdef" 
morse_chars  =  [ ".-" ,  "-..." ,  "-.-." ,  "-.." ,  "." ,  “..-.” ] 
text2morse  =  dict ( zip ( abc ,  morse_chars ))
打印( text2morse )

输出:

{'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.', 'F': '..-。'}

脚注

1数据来自 2020 年 4 月 1 日,不是开玩笑。位置是任意选择的。然而,有一个特殊的原因,为什么我选择了 Hohenpeißenberg。在 Hohenpeißenberg 上,我受邀为德国气象局教授两门令人难忘的 Python 课程:伟大的人和美妙的景色!

 

<think>我们正在回答用户关于Pythonzip函数的使用方法示例的问题。 根据用户要求,我们需要使用中文回答,并且遵循LaTeX格式要求(行内公式用$...$,独立公式用$$...$$并单独成段)。 同时,我们需要生成相关问题,并在回答中自然地添加引用标识(如果引用到了站内内容)。 用户的问题:我想了解 Pythonzip 函数的使用方法或相关操作 请问Python zip function usage and examples 根据提供的引用,我们可以参考: 引用[1]:解释了zip函数创建的是一个zip对象,只有当传递给可迭代对象(如list, tuple)时才会实际执行并显示结果。 引用[2]:展示了一个使用lambdasys.stdout.write模仿打印的例子,其中用到了mapstr,但未直接涉及zip。 引用[3]:是关于Python库的说明,指出库参考手册描述了标准库。 我们重点参考引用[1]来回答zip函数的使用。 回答结构: 1. 介绍zip函数的作用:将多个可迭代对象中对应的元素打包成一个个元组,然后返回一个可迭代的zip对象。 2. 说明zip对象的特点:它是一个迭代器,不会立即计算,只有在需要的时候才会产生元素(惰性求值)。 3. 展示基本用法:通常与list()、tuple()等一起使用来查看结果,或者用于循环。 4. 提供示例代码。 5. 讨论一些常见的使用场景技巧,如处理不等长序列、与enumerate结合、解压等。 6. 生成相关问题。 注意:在回答中,如果引用了站内内容,需要在引用处添加引用标识,例如[^1]。由于引用[1]与zip函数直接相关,我们会在解释惰性求值时引用。 开始回答:</think>### Pythonzip 函数的使用方法及示例 `zip()` 是 Python 的内置函数,用于将多个可迭代对象(如列表、元组等)中对应的元素打包成元组,返回一个**惰性计算的 zip 对象**(迭代器)。仅当被转换为列表或循环遍历时才会实际计算值[^1]。 #### 📌 基础用法 ```python names = ["Alice", "Bob", "Charlie"] ages = [25, 30, 28] zipped = zip(names, ages) # 创建 zip 对象 print(list(zipped)) # 触发实际计算 # 输出: [('Alice', 25), ('Bob', 30), ('Charlie', 28)] ``` #### ⚡ 处理不等长序列 默认以**最短序列长度**为基准截断: ```python letters = ['A', 'B', 'C'] numbers = [1, 2] print(list(zip(letters, numbers))) # [('A', 1), ('B', 2)] ``` 使用 `itertools.zip_longest` 可填充缺失值: ```python from itertools import zip_longest print(list(zip_longest(letters, numbers, fillvalue="-"))) # 输出: [('A', 1), ('B', 2), ('C', '-')] ``` #### 🔄 常见应用场景 1. **同步遍历多个序列** ```python for name, age in zip(names, ages): print(f"{name} is {age} years old") # Alice is 25 years old # Bob is 30 years old # ... ``` 2. **矩阵转置** ```python matrix = [[1, 2, 3], [4, 5, 6]] transposed = list(zip(*matrix)) # 解包操作 print(transposed) # [(1, 4), (2, 5), (3, 6)] ``` 3. **字典键值合并** ```python keys = ['a', 'b'] values = [100, 200] my_dict = dict(zip(keys, values)) print(my_dict) # {'a': 100, 'b': 200} ``` 4. **与 `enumerate` 结合使用** ```python for i, (name, age) in enumerate(zip(names, ages)): print(f"Index {i}: {name} ({age})") ``` #### ⚠️ 注意事项 - Zip 对象是**一次性迭代器**,遍历后即耗尽: ```python zipped = zip(names, ages) list(zipped) # [('Alice', 25), ...] list(zipped) # [] (已耗尽) ``` - 在 Python 2 中 `zip()` 直接返回列表,而 Python 3 返回迭代器(节省内存)。 #### 💡 进阶技巧 - **并行排序**: ```python sorted_data = sorted(zip(ages, names)) # 按年龄排序 # [(25, 'Alice'), (28, 'Charlie'), (30, 'Bob')] ``` - **多序列运算**: ```python sales = [120, 95, 110] costs = [80, 70, 90] profits = [s - c for s, c in zip(sales, costs)] # [40, 25, 20] ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值