咨询Python中迭代列表相邻元素对的更优雅实现方式
更自然地迭代列表相邻元素对的Python实现
哈哈,太懂这种被Python的优雅特性惯坏的感觉了!想要那种更简洁直观的写法当然有,而且不止一种方案,给你整理几个常用的:
1. 最简洁的方案:用zip函数
这是最常用也最直观的写法,直接用zip把原列表和它的切片(从第二个元素开始)配对就行:
L = [12, 15, 29, 100, 239] for i, j in zip(L, L[1:]): print(i, j)
运行结果和你原来的代码完全一致。唯一要注意的是,L[1:]会创建一个原列表的切片副本,如果你的列表特别大,可能会占用额外内存,但绝大多数日常场景下这都不是问题。
2. 内存友好版:用itertools.islice
如果要处理超大列表,不想创建切片副本,可以用itertools里的islice生成迭代器,这样不会额外占用内存:
from itertools import islice L = [12, 15, 29, 100, 239] for i, j in zip(L, islice(L, 1, None)): print(i, j)
islice(L, 1, None)会返回一个从原列表第二个元素开始的迭代器,和原列表的迭代器一起传给zip,效率拉满。
3. 完全符合你预期的写法:自定义生成器函数
如果你就是想要for i, j in intervals(L)这种形式,自己写个生成器函数就搞定了,还能复用:
def intervals(lst): for i in range(len(lst)-1): yield lst[i], lst[i+1] L = [12, 15, 29, 100, 239] for i, j in intervals(L): print(i, j)
这个函数本质上就是把你原来的循环逻辑封装成了生成器,用起来完全符合你的预期,代码可读性也很高。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

