首页 > 编程语言 >python内置zip函数详解

python内置zip函数详解

时间:2024-07-19 23:29:48浏览次数:13  
标签:zip 迭代 python age iter 详解 print new

    

     在Python中,zip是一个内置函数(其实是一个class),可以将多个可迭代对象(如列表、元组等)作为参数,将对象中对应index的元素打包成一个个的元组,然后返回由这些元组tuple组成的zip迭代器(之前文章讲过,类中包含了__iter__ 和__next__魔法方法可作为迭代器)。

以下是python3.10版本builtins.py中内置的zip类的原始代码:

zip类接收2个参数:

  • iterables:接受一个或多个可迭代对象,如列表、元组、字符串、字典的键或值(通过keys(), values(), items()等方法获取),range对象等。
  • strict=False(该参数是python3.10版本增加):默认为False,表示当迭代对象的length不同时,zip默认使用最小length组成元组,不会报错。否则传入True时会报某对象的length不一致的错误。

1 zip对象处理逻辑示意图

2 zip对象返回的是迭代器

举例:定义两个列表,通过instance函数判断zip对象是否是迭代器

from collections.abc import Iterable,Iterator
list1 = ['name', 'age', 'color']
list2 = ['wang', '12', 'black']
new_iter = zip(list1,list2)
print(isinstance(new_iter,Iterator))
结果打印为:
True

因为是迭代器,我们可以用next函数返回zip对象的元素。

print(next(new_iter))
print(next(new_iter))

以下打印结果也验证了开篇说明的通过zip函数将可迭代对象相同index位置的元素组成了元组。

('name', 'wang')
('age', '12')

3 将zip对象转为list,tuple,set,dict等对象

既然是返回的迭代器,我们可以将上述示例中的迭代器转为可迭代对象。

  • 转为list对象:
print(list(new_iter))
#结果
[('name', 'wang'), ('age', '12'), ('color', 'black')]
  • 转为tuple对象:
print(tuple(new_iter))
#结果
(('name', 'wang'), ('age', '12'), ('color', 'black'))
  • 转为集合对象:
print(set(new_iter))
#结果
{('name', 'wang'), ('color', 'black'), ('age', '12')}
  • 转为字典对象:
print(dict(new_iter))
#结果
{'name': 'wang', 'age': '12', 'color': 'black'}

注释:如果每个元组元素大于两个,转换字典会报错,因为字典只需要两个元素组成key和value。

4 使用*解包

举例:list1中嵌套了两个list,使用*list1传入zip作为可迭代对象

list1 = [['name', 'age', 'color','height'],['wang', '12', 'black']]
new_iter = zip(*list1)
print(list(new_iter))
结果:
[('name', 'wang'), ('age', '12'), ('color', 'black')]

举例: 拆解为原来的可迭代对象

x = [1, 2, 3]
y = [4, 5, 6]
print(list(zip(x, y)))
#结果
[(1, 4), (2, 5), (3, 6)]
#拆解为原来的可迭代对象
x2, y2 = zip(*zip(x, y))
print(x == list(x2) and y == list(y2))
True

5 strict参数的作用

举例:定义两个不同长度的list,设置strict=True,zip对象执行会报错

list1 = ['name', 'age', 'color','height']
list2 = ['wang', '12', 'black']
new_iter = zip(list1,list2,strict=True)

执行后报ValueError的错误:

参数默认为False则不会报错,结果如下:

new_iter = zip(list1,list2)
print(list(new_iter))
[('name', 'wang'), ('age', '12'), ('color', 'black')]

6 itertools.zip_longest()介绍

如果可迭代对象长度不同,使用itertools.zip_longest对象可以将不满足长度的元素填充其他值代替(默认使用None代替,可传参数fillvalue=其他值)

  • 使用默认值None填充
from itertools import zip_longest 
list1 = ['name', 'age', 'color','height']
list2 = ['wang', '12', 'black']
new_iter1 = zip_longest(list1,list2)
print(list(new_iter1))

结果:

[('name', 'wang'), ('age', '12'), ('color', 'black'), ('height', None)]
  • 设置其他固定值填充
new_iter1 = zip_longest(list1,list2,fillvalue='1m')
print(list(new_iter1))

结果:

[('name', 'wang'), ('age', '12'), ('color', 'black'), ('height', '1m')]

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习和关注,谢谢大家。

标签:zip,迭代,python,age,iter,详解,print,new
From: https://blog.csdn.net/kymppcds/article/details/140560673

相关文章

  • 将Json格式的文件转为Excel格式文件的python代码
    importpandasaspdimportosfromopenpyxlimportWorkbook'''pandas是Python中用于数据分析的一个非常强大的库,它提供了快速、灵活和表达式丰富的数据结构,旨在使“关系”或“标签”数据的处理工作变得既简单又直观。pandas非常适合于处理表格数据,如CSV文件、SQL查询结......
  • Python正则表达式
    文章目录了解元字符常用的元字符正则表达式进阶re模块match方法切分字符串分组贪婪匹配预编译字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单......
  • Python进阶(4)--正则表达式
    正则表达式在Python中,正则表达式(RegularExpression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。在这之前,还记得之前我们是通过什么方法分割字符串的嘛?strs="a,b;c@d"print(strs.split(",")) #以“,”为分割点分割......
  • 0基础学python-18:掌管匹配机制的模块——re
    目录前言使用正则表达式的背景: 元字符 匹配的范围 正则表达式1.importre2.re.match(r"匹配的规则",所要匹配的字符串) 3.匹配一个变量名 4.转义字符的匹配5.分组匹配6.贪婪匹配7.预编译前言        正则表达式(RegularExpression,简称regex或......
  • 攻防世界Web_python_template_injection(新手模式)
    二、Web_python_template_injection1.基本知识点模版引擎模版引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易,但是模板引擎也拓宽了我们的攻击面,注入到模板中的代码可能会引发RCE或者XSS。在Jinja2......
  • 零基础入门:创建一个简单的Python爬虫管理系统
    摘要:本文将手把手教你,从零开始构建一个简易的Python爬虫管理系统,无需编程基础,轻松掌握数据抓取技巧。通过实战演练,你将学会设置项目、编写基本爬虫代码、管理爬取任务与数据,为个人研究或企业需求奠定坚实基础。一、前言:数据之海,从何舀水?在这个信息爆炸的时代,数据如同海洋,而......
  • Protobuf详解与使用
    目录一、Protobuf序列化概述二、Protobuf的原理三、protobuf的安装四、定义message五、编译message文件六、应用Protobuf七、Message的使用1、Message的基本用法2、Message的嵌套使用一、Protobuf序列化概述protobuf是一种比json和xml等序列化工具更加轻量和高......
  • 又来了哦,Python函数 | |
    1.变量的作用域(global与nonlocal)Python中的变量作用域可以通过global和nonlocal关键字来管理。‌全局变量:‌在Python中,‌使用global关键字可以在函数内部访问和修改全局变量。‌当需要在函数内部对全局变量进行操作时,‌应使用global关键字声明该变量,‌这样函数内部的操作就......
  • Java基础-详解String类
    为什么String类是不可变的publicfinalclassString{privatefinalchar[]value;}由以上String类的源码可以看出,String类内部使用字符数组char[]来存储字符串(Java9后修改为byte[]字节数组),而且数组被final修饰且为私有的,String类没有提供修改该字符串方法,以及由于S......
  • python_day7
    数据类型​ 之前数字/字符串类型 之后字典\布尔类型列表类型使用列表的几个函数先建一个列表如name_list=['linda','david','louis','kevin','linda]取值时,直接print(name_list[0])或者选取其他的数字替换0,也可以倒数取-1,-2...,还能[0:2],[-3:]这样进行选取几个......