Python中将可迭代对象首元素追加至末尾,求更简洁的itertools实现方案
优化“闭合循环”可迭代对象的实现
你的原代码逻辑通顺,这里提供几种更简洁高效的实现方式,基于itertools和more_itertools:
基于itertools的精简实现
用单元素元组替代列表传递单个元素(元组创建更轻量、性能更优),避免不必要的列表容器开销:
from collections.abc import Iterable from itertools import chain def close_loop(iterable: Iterable) -> Iterable: iterator = iter(iterable) first = next(iterator) # 单元素元组比列表更高效,符合迭代器的轻量特性 return chain((first,), iterator, (first,))
测试效果与原代码完全一致:
list(close_loop(range(5))) # [0, 1, 2, 3, 4, 0] ''.join(close_loop('abc')) # 'abca'
基于more_itertools的优雅实现
利用more_itertools.peekable可查看迭代器首个元素且不消耗迭代器的特性,结合append函数直接在迭代器末尾追加元素,逻辑更直观:
from collections.abc import Iterable from more_itertools import peekable, append def close_loop(iterable: Iterable) -> Iterable: it = peekable(iterable) # peek获取首个元素,append直接完成末尾追加操作 return append(it, it.peek())
这个版本无需手动拆分迭代器的首个元素与剩余部分,代码更简洁,业务意图也更清晰。
如果不想依赖append,也可以直接用chain配合peekable实现:
from collections.abc import Iterable from itertools import chain from more_itertools import peekable def close_loop(iterable: Iterable) -> Iterable: it = peekable(iterable) return chain(it, (it.peek(),))
内容的提问来源于stack exchange,提问作者VY_CMa
相关产品推荐
相关产品推荐

