第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个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。

时间: 2024-10-13 02:39:30

第11条:用zip函数同时遍历两个迭代器的相关文章

Effective Python 小笔记之 zip 函数

环境:Python 3.5.1 CentOS 7 zip函数可以同时遍历两个迭代器. 在编写Python代码时,通常要面对很多列表,而这些列表中的对象,可能是相互关联的.如下例:     names = ['Cecilia', 'Lily', 'Maria']     length = [len(word) for word in names] 对于上例中的源列表和派生列表,相同索引处有关联关系,以此再引申出一个例子:     longest_name = None     max_length

Python的range、enumerate和zip函数用法

range函数可创建一个整数列表.如果需要知道当前元素在列表中的索引,推荐用enumerate代替range.zip函数用于同时遍历多个迭代器. 一.range 函数 range函数可创建一个整数列表,一般用在 for 循环中. 语法: range([start,] stop[, step]) 参数: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0,5); stop: 计数到 stop 结束,但不包括 stop.例如:range(0,5) 是

python之zip函数和sorted函数

# zip()函数和sorted()函数 # zip()函数:将两个序列合并,返回zip对象,可强制转换为列表或字典 # sorted()函数:对序列进行排序,返回一个排序后的新列表,原数据不改变 # 合并两个列表,以列表类型输出 list_str = ['a', 'b', 'c', 'd'] list_num = [1, 2, 3, 4] list_new = zip(list_str, list_num) print("zip结果(列表):", list(list_new)) #

zip函数和sorted函数

###zip函数 如果处理两个列表的话就以列表的形式输出 比如 list_a = [1,2,3,4,5] list_b = ['a','b','c','d','e'] list_c = zip(list_b,list_a) 输出结果为:[('a', 1), ('b', 2), ('c', 3), ('d', 4),('e',5)] # 合并两个字符串,以字典类型输出str_a = "123456"str_b = "abcdef"str_c = zip(str_a,s

python列表中enumerate和zip函数用法

enumerate: 定义:enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标 例子: 1 list1 =[89,98,00,75,68,37,58,90] 2 for index,item in enumerate(list1): 3 if str(item)!='0': 4 list1[index]=int('19'+str(item)) 5 else: 6 list1[index]=int('200'+str(item)

zip函数-Python 3

zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表. zip函数在获取数据后,生成字典(dict)时比较好用. for examples: 1 # Code based on Python 3.x 2 # _*_ coding: utf-8 _*_ 3 # __Author: "LEMON" 4 5 pList = [('li', 'LY', 80), ('zeng', 'ZW', 90), ('dudu', 'LR', 98)] 6 names = [] 7

20170419 zip函数

一.定义: zip([iterable, ...])zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表).若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同.利用*号操作符,可以将list unzip(解压). 二.用法示例: 读者看看下面的例子,对zip()函数的基本用法就可以明白了: 1 2 3 4 5 6 7 8 9 >>> a = [1,2,3

提高程序员项目设计水平的11条建议

1.分析清楚你要面对的项目. 这是进行所有工作的第一步,如果你在这个地方都犯错了,那么后续所做的一切努力都是白费.比如,你要完成图书管理系统,那么你就应该明白这个系统主要是用于解决图书管理的问题. 2.考虑项目设计的方法. 在这个阶段,你要根据这个项目的特点考虑设计的工具和语言.比如,对于图书管理系统,它需要封装性好,这样有利于管理和维护.而这个系统开发周期较短,功能较简单.所以,根据其特点,选择Java作为开发语言会是一个不错的选择. 3.收集完整的需求. 花时间整理清楚你的用户群的基本需求有

python中的zip()函数

本文转自:http://www.jb51.net/article/53051.htm 本文实例讲述了Python中zip()函数的定义及用法,相信对于Python初学者有一定的借鉴价值.详情如下: 一.定义: zip([iterable, ...])zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表).若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同.利用*