第11条:用zip函数同时遍历两个迭代器
核心知识点:
(1)内置的zip函数可以平行地遍历多个迭代器。
(2)python3中地zip相当于生成器,会在遍历过程中逐次产生元祖。而python2中地zip则是直接把这些元祖完全生成好,并一次性地返回整份列表。
(3)如果提供地迭代器长度不等,那么zip就会自动提前终止。
(4)itertools内置模块中地zip_longest函数可以平行地遍历多个迭代器,而不用在乎它们地长度是否相等。
在编写python代码时,我们通常要面对很多列表,而这些列表里的对象,可能也是相互关联的。
通过列表推导式,很容易就能根据某个表达式从源列表推算出一份派生类表。
>>> name_list
['kebi', 'maoxian', 'xiaoniao', 'xingye']
>>> letters = [len(n) for n in name_list]
对于本例中的派生列表和源列表来说,相同索引处的两个元素之间有着关联。
如果要平行地迭代这两份列表,那么可以根据name_list源列表的长度来执行循环。
>>> name_list
['kebi', 'maoxian', 'xiaoniao', 'xingye']
>>> letters = [len(n) for n in name_list]
>>> longest_name = None
>>> max_letters = 0
>>> for i in range(len(name_list)):
... count = letters[i]
... if count > max_letters:
... longest_name = name_list[i]
... max_letters = count
...
>>> print(longest_name)
xiaoniao
上面这段代码的问题在于,整个循环语句看上去很乱。用下标来访问name_list和letters会使代码不易阅读。
用循环下标i来访问数组的写法一种出现了两次,改用enumerate来做可以稍稍缓解这个问题,但仍然不够理想。
>>> for i,name in enumerate(name_list):
... count = letters[i]
... if count > max_letters:
... longest_name = name
... max_letters = count
...
使用python内置的zip函数,能够令上述代码变得更为简洁。
在python3中的zip函数,可以把两个或者两个以上的迭代器封装成生成器,以便稍后求值。
这种zip生成器,会从每个迭代器中获取该迭代器的下一个值,然后把这些值汇聚成一个元祖(tuple)。
与通过下标来访问多份列表的那种写法相比,这种用zip写出来的代码更加清晰。
>>> for name,count in zip(name_list,letters):
... if count > max_letters:
... longest_name = name
... max_letters = count
内置函数zip有两个问题。
第一个问题是,python2中的zip并不是生成器,而是会把开发者所提供的那些迭代器,都平行的遍历一次,
在此过程中,它都会把那些迭代器所产生的值汇聚成元祖,并把那些元祖所构成的列表完整的返回给调用者。
这可能会占用大量内存并导致程序崩溃。如果要在python2里面用zip来遍历数据量非常大的迭代器,那么应该使用itertools内置模块中的izip函数。
第二个问题是,如果输入的迭代器长度不同,那么zip会表现出奇怪的行为。
文章摘抄于Brett Slatkin的《编写高质量Python代码的59个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。
第11条:用zip函数同时遍历两个迭代器的更多相关文章
- Python的range、enumerate和zip函数用法
range函数可创建一个整数列表.如果需要知道当前元素在列表中的索引,推荐用enumerate代替range.zip函数用于同时遍历多个迭代器. 一.range 函数 range函数可创建一个整数列表 ...
- python之zip函数和sorted函数
# zip()函数和sorted()函数 # zip()函数:将两个序列合并,返回zip对象,可强制转换为列表或字典 # sorted()函数:对序列进行排序,返回一个排序后的新列表,原数据不改变 # ...
- python zip函数(11)
一.zip函数描述和使用 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,返回的结果可以直接强转为list列表,这样做的好处是节约了不少的 ...
- Python:zip 函数的用法
zip() 接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个 tuple,然后返回由这些 tuple 组成的 list. 若传入参数的长度不等,则返回 list 的长度和参数中长度最短的 ...
- 【外】001-python3之zip函数
zip函数语法格式zip(可迭代对象1, 可迭代对象2, ... ,可迭代对象n) 函数接收任意个可迭代对象作为参数, 将所有对象中对应位置上的元素分别打包在一起组成一个tuple, 并将所有的tup ...
- python中使用zip函数出现<zip object at 0x02A9E418>
在Python中使用zip函数,出现<zip object at 0x02A9E418>错误的原因是,你是用的是python2点多的版本,python3.0对python做了改动 zip方 ...
- python中的 zip函数详解
python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...
- Pythonh中的zip()与*zip()函数详解
前言 实验环境: Python 3.6: 示例代码地址:下载示例: 本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables)函数详解 ...
- python中的zip()函数和map()函数
一.zip()函数 1.语法: zip(iterable, ...) 参数说明: iterable,...-- 一个或多个迭代器; 在python2中: zip() 函数用于将可迭代的对象作为参数,将 ...
随机推荐
- Java 过滤所有html标签,复制文件到指定位置
public static String filterHtml(String string) { String str = string.replaceAll("<[a-zA-Z]+[ ...
- cache和buffer区别探讨
一. 1.Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的.它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用.比如生产者——消费者问题,他们产生和消耗资源的速度大体 ...
- background API
语法: background:bg-color bg-image position/bg-size bg-repeat bg-origin bg-clip bg-attachment initial| ...
- Java交通灯系统
交通灯管理项目模拟了对十字路口交通灯的控制,一般在我们生活中的十字路口是有人行道的,而此项目没有考虑人行道.具体需求如下: 1.异步随机生成按照各个路线行驶的车辆. 例如: ...
- memcached windows 修改端口
要想在windows中使用memcached,必须先下载memcached for win32安装. 下载地址:http://jehiah.cz/projects/memcached-win32/ 解 ...
- man page及info page用法
Linux系统的在线求助man page与info page 先来了解一下Linux有多少命令呢?在文本模式下,你可以直接按下两个[Tab]按键,看看总共有多少命令可以让你用? [vbird@www ...
- php7.0 出现 curl_setopt(): Disabling safe uploads is no longer supported in 报错!
项目换成php7.0,进行了测试,使用curl时,出现: curl_setopt(): Disabling safe uploads is no longer supported in xxx.定位到 ...
- Hibernate 中的DetachedCriteria。
今天看到项目中在Web层使用DetachedCriteria进行多条件查询操作,如果在web层做持久层操作,事物还存在吗?这是我第一反应,于是乎就去网上查资料了.结果发现即在web层,程序员使用Det ...
- Java中的使用了未经检查或不安全的操作(类前加:@SuppressWarnings("unchecked"))
Java中的使用了未经检查或不安全的操作 如此解决就可以了 类前面加@SuppressWarnings("unchecked") @SuppressWarnings("u ...
- 2015年Android开发新技术盘点
又到年末. 利用中午的时间,汇总盘点一下今年Android开发方面的新技术.感觉如今Android开发没有曾经那么纯粹了,出现了非常多新的开发模式. 2015年影响比較普遍的新技术应该就是Materi ...