Python用next()遍历日期列表取两相邻日期触发TypeError问题
实现Python列表中相邻datetime.date元素成对遍历
需求说明
- 遍历存储
datetime.date类型值的列表,每次同时取出两个相邻日期传入业务流程 - 全程保留日期原生类型,不使用日期转文本再转回日期的冗余方案
初始错误实现
初始编写的代码如下:
import datetime listdates=[datetime.date(2022, 2, 10),datetime.date(2022, 2, 11),datetime.date(2022, 2, 12),datetime.date(2022, 2, 13),datetime.date(2022, 2, 14)] for a in listdates: print(a,next(a))
运行代码抛出如下异常:
TypeError: 'datetime.date' object is not an iterator
报错原因:next()仅可作用于迭代器对象,datetime.date是日期值类型,本身不是迭代器,无法通过调用next(a)拿到列表中的下一个元素。
正确实现方案
两种方案均全程操作原生datetime.date对象,无任何类型转换开销:
方案1:索引遍历(无依赖,逻辑直观)
遍历到列表倒数第二个元素截止,每次通过索引取当前位置和下一个位置的元素即可:
import datetime listdates = [datetime.date(2022, 2, 10),datetime.date(2022, 2, 11),datetime.date(2022, 2, 12),datetime.date(2022, 2, 13),datetime.date(2022, 2, 14)] for i in range(len(listdates) - 1): date_a = listdates[i] date_b = listdates[i+1] # 此处可直接将两个原生日期值传入业务流程 print(date_a, date_b)
方案2:zip配对(更符合Python编码习惯)
利用zip将原列表和去掉首元素的切片列表逐位配对,自动生成相邻元素对,不需要手动维护索引:
import datetime listdates = [datetime.date(2022, 2, 10),datetime.date(2022, 2, 11),datetime.date(2022, 2, 12),datetime.date(2022, 2, 13),datetime.date(2022, 2, 14)] for date_a, date_b in zip(listdates, listdates[1:]): # 两个值均为原列表存储的原生datetime.date类型 print(date_a, date_b)
两段代码运行输出一致:
2022-02-10 2022-02-11 2022-02-11 2022-02-12 2022-02-12 2022-02-13 2022-02-13 2022-02-14
内容的提问来源于stack exchange,提问作者Stumbling Through Data Science
相关产品推荐
相关产品推荐

