深入了解Python enumerate和zip

enumerate

首先介绍的是enumerate函数。

在我们日常编程的过程当中,经常会遇到一个问题。

在C语言以及一些古老的语言当中是没有迭代器这个概念的,所以我们要遍历数组或者是容器的时候,往往只能通过下标。有了迭代器之后,我们遍历的过程方便了很多,我们可以直接用一个变量去迭代一个容器当中的值。最简单的例子就是数组的遍历,比如我们要遍历items这个数组。我们可以直接:

for item in items:

通过迭代器的方式我们可以很轻松地遍历数组,而不再需要下标,也不需要计算数组的长度了。但是如果我们在循环体当中需要知道元素的下标该怎么办?

难道我们真的只能在下标和迭代器当中选择一个吗,比如在循环体的外面添加一个变量来记录下标?

idx = 0
for item in items:
  operation()
  idx += 1

这样可以解决问题,但是很麻烦,一点也不简洁,用专业的话来说一点也不pythonic(符合Python标准的代码)。为了追求pythonic,于是有了enumerate函数,来解决了我们又想直接迭代又需要知道元素下标的情形。

它的用法也很简单,我们把需要迭代的对象或者迭代器传入enumerate函数当中,它会为我们创建一个新的迭代器,同时返回下标以及迭代的内容。我们来看一个例子:

for i, item in enumerate(items):

除此之外,enumerate还支持传入参数。比如在某些场景当中,我们希望下标从1开始,而不再是0开始,我们可以额外多传入一个参数实现这点:

for i, item in enumerate(items, 1):

循环是我们编程的时候必不可少的操作,也正因此,enumerate函数使用非常广泛。但是有一点需要注意,如果我们迭代的是一个多元组数组,我们需要注意要将index和value区分开。举个例子:

data = [(1, 3), (2, 1), (3, 3)]

在不用enumerate的时候,我们有两种迭代方式,这两种都可以运行。

for x, y in data:

for (x, y) in data:

但是如果我们使用enumerate的话,由于引入了一个index,我们必须要做区分,否则会报错,所以我们只有一种迭代方式:

for i, (x, y) in enumerate(data):

zip

接下来要介绍的另一个函数同样是方便我们迭代的,不过它针对的是另一个场景——多对象迭代。

它的应用场景非常简单,就是我们想要同时迭代多份数据,比如用户的名字和用户的职业数据是分开的,我们希望同时遍历一个用户的职业和名字。如果不使用zip,我们可能只能放弃迭代器回到传统的下标遍历的模式了。这样当然是可以的,不过有两个小问题,第一个小问题当然是代码的可读性变差了,不够pythonic,第二个问题是我们需要维护两个容器长度不一样的情况,会增加额外的代码。而使用zip,可以同时解决以上两个问题。

我们来看一个例子:

names = ['xiaoming', 'xiaohua', 'xiaohei', 'xiaoli']
jobs = ['coach', 'student', 'student', 'student', 'professor']

for name, job in zip(names, jobs):
 print(name, job)

最后输出的结果是人名和职业的tuple:

xiaoming coach
xiaohua student
xiaohei student
xiaoli student

上面举的例子当中,names和jobs的长度其实是不一致的,在使用了zip的情况下,会自动替我们按照其中较短的那个进行截断。如果我们不希望截断,我们也可以使用itertools下的zip_longest来代替zip:

from itertools import zip_longest
for name, job in zip_longest(names, jobs):

这样的话长度不够的元素会以None来填充,zip_longest提供了一个参数fillvalue,可以填充成我们指定的值。

无论是zip还是zip_longest,都可以支持多迭代器的遍历。比如:

names = ['xiaoming', 'xiaohua', 'xiaohei', 'xiaoli']
jobs = ['coach', 'student', 'student', 'student', 'professor']
hobbies = ['footbal', 'tennis', 'badminton', 'basketbal']

for name, job, hobby in zip(names, jobs, hobbies):
 print(name, job, hobby)

zip除了方便我们迭代遍历之外,另一个很大的用处是可以很方便地生成dict。比如刚才的例子当中,我们想生成一个名称和职业的dict,一般的办法当然是先定义一个dict,然后遍历所有的key和value,来生成dict。然而使用zip,我们可以将这个操作简化到一行代码:

jobDict = dict(zip(names, jobs))

需要注意的是,我们调用zip返回的结果其实是一个迭代器,我们在转化成dict的时候自动遍历了迭代器当中的内容。比如我们如果直接打印出zip调用结果的话,就会发现屏幕上输出的是一个迭代器的地址:

print(zip(names, jobs))
>>> <zip object at 0x10ec93b40>

我们想要获得它的内容,需要将它手动转成list:

print(list(zip(names, jobs)))
>>> [('xiaoming', 'coach'), ('xiaohua', 'student'), ('xiaohei', 'student'), ('xiaoli', 'student')]

无论是enumerate还是zip其实底层都是基于迭代器实现的,从原理上来说并没有什么太深奥的内容,而且我们不使用它们也不影响我们写代码。但是Python之所以是Python,之所以很多人称道它简洁的语言和逻辑,离不开我们广泛地使用这些简化代码逻辑的工具和方法。因此我们加以了解是非常有必要的,希望大家都能写出pythonic的代码,不仅写代码能力强,而且代码本身也漂亮。

以上就是深入了解Python enumerate和zip的详细内容,更多关于Python enumerate和zip的资料请关注我们其它相关文章!

(0)

相关推荐

  • python中enumerate() 与zip()函数的使用比较实例分析

    本文实例讲述了python中enumerate() 与zip()函数的使用比较.分享给大家供大家参考,具体如下: enumerate() 与zip()是两个常用的内置函数,这两个函数功能类似,同时又存在差异.介绍如下: 一.enumerate() 函数 该函数中文解释:枚举.列举的意思. 用于将一个可遍历的数据对象(如:列表.元组.字符串等)组合为一个索引序列,同时列出:数据和数据下标 一般在for循坏中使用,可同时得到数据对象的值及对应的索引值 a = ['one','two','three'

  • Python学习笔记之Zip和Enumerate用法实例分析

    本文实例讲述了Python Zip和Enumerate用法.分享给大家供大家参考,具体如下: Python 中的 Zip zip的作用:可以在处理循环时用到,返回一个将多个可迭代对象组合成一个元组序列的迭代器.每个元组都包含所有可迭代对象中该位置的元素. my_zip = list(zip(['a', 'b', 'c'], [1, 2, 3])) print(my_zip) # [('a', 1), ('b', 2), ('c', 3)] 正如 range() 一样,我们需要将其转换为列表或使用

  • 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

  • python进阶教程之循环相关函数range、enumerate、zip

    在"循环"一节,我们已经讨论了Python基本的循环语法.这一节,我们将接触更加灵活的循环方式. range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标. 之前我们已经使用过range()来控制for循环.现在,我们继续开发range的功能,以实现下标对循环的控制: 复制代码 代码如下: S = 'abcdefghijk' for i in range(0,len(S),2):     print S[i] 在该例子中,我们利用l

  • 深入了解Python enumerate和zip

    enumerate 首先介绍的是enumerate函数. 在我们日常编程的过程当中,经常会遇到一个问题. 在C语言以及一些古老的语言当中是没有迭代器这个概念的,所以我们要遍历数组或者是容器的时候,往往只能通过下标.有了迭代器之后,我们遍历的过程方便了很多,我们可以直接用一个变量去迭代一个容器当中的值.最简单的例子就是数组的遍历,比如我们要遍历items这个数组.我们可以直接: for item in items: 通过迭代器的方式我们可以很轻松地遍历数组,而不再需要下标,也不需要计算数组的长度了

  • Python中的 enumerate和zip

    目录 前言 1. enumerate 方法 2. zip 方法 总结 前言 我们在上一期学习了关于Python 迭代器Iterator详情相关的概念,满足迭代器需要符合两个条件 实现__iter__()方法:返回迭代器本省 实现__next__()方法:返回迭代器的下一项 同时,Python中提供数据类型如列表.字典.元组等序列是可迭代对象,可结合for...in 来进行遍历为使我们的代码更加高效且优雅,Python也提供两个关于迭代的方法. 因此,本期我们来学习enumerate函数和zip函

  • 浅谈Python中的zip()与*zip()函数详解

    前言 1.实验环境: Python 3.6: 2.示例代码地址:下载示例: 3.本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables)函数详解 zip()函数的定义 从参数中的多个迭代器取元素组合成一个新的迭代器: 返回: 返回一个zip对象,其内部元素为元组:可以转化为列表或元组: 传入参数:元组.列表.字典等迭代器. zip()函数的用法 当zip()函数中只有一个参数时 zip(iterable)从iterable中依次取

  • Python enumerate()计数器简化循环

    目录 一.for在 Python 中使用循环进行迭代 二.使用 Python 的 enumerate() 三.用 Python 练习 enumerate() 1.可迭代项的自然计数 四.理解 Python enumerate() 五.解包参数 enumerate() 六.结论 摘要: 当我们需要计数和迭代中的值时,Pythonenumerate()允许编写 Pythonicfor循环.最大的优点enumerate()是它返回一个带有计数器和值的元组,因此您不必自己增加计数器.它还为您提供了更改计

  • python下解压缩zip文件并删除文件的实例

    利用python下载数据,下载下来的数据为zip格式,因为有上千个这样的文件,因此便直接在爬虫程序里加入了解压缩zip文件的内容,并且因为数据量较大,为了节省空间,便在解压缩后立即删除该zip文件. 先来介绍解压缩的方法: import zipfile filename = '/home/username/work/1.zip' fz = zipfile.ZipFile(filename, 'r') for file in fz.namelist(): fz.extract(file, path

  • Python enumerate索引迭代代码解析

    本文研究的主要是Python enumerate索引迭代的问题,具体介绍如下. 索引迭代 Python中,迭代永远是取出元素本身,而非元素的索引. 对于有序集合,元素确实是有索引的.有的时候,我们确实想在 for 循环中拿到索引,怎么办? 方法是使用 enumerate() 函数: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] >>> for index, name in enumerate(L): ... print index,

  • Python enumerate函数功能与用法示例

    本文实例讲述了Python enumerate函数功能与用法.分享给大家供大家参考,具体如下: eunmerate在英文中是列举.枚举的意思,在python中eunmerate()是一个内置的函数,用于在一个可迭代或可遍历的对象(如列表.字符串.数组.字典)中,将对象组成一个一个序列和索引,可以同时获得索引和索引值. enumerate函数原型: enumerate(sequence, [start=0]) 功能:将可循环序列sequence以start开始分别列出序列数据和数据下标: 即对一个

  • python中使用zip函数出现<zip object at 0x02A9E418>错误的原因

    python中zip函数返回一个以元组为元素的列表,其中第 i 个元组包含每个参数序列的第 i 个元素.返回的列表长度被截断为最短的参数序列的长度.只有一个序列参数时,它返回一个1元组的列表.没有参数时,它返回一个空的列表.概括起来一句话: zip函数返回的是一个列表,但是列表里面的元素是由一个个元组构成的.. 在Python中使用zip函数,出现<zip object at 0x02A9E418>错误的原因是,你是用的是python2点多的版本,python3.0对python做了改动 zi

  • Python enumerate函数遍历数据对象组合过程解析

    这篇文章主要介绍了Python enumerate函数遍历数据对象组合过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. Python 2.3. 以上版本可用,2.6 添加 start 参数. enumerate(sequence, [start=0]) # sequence 是一个序

随机推荐