如何解决迭代器是否等效于python中的切片?
什么是获得等效于此切片的迭代器的惯用且有效的方法?
obj[start:stop:step]
在功能上等效于(我认为)这样的东西:
def iter_slice(obj,start,stop,step=None):
length = len(obj)
range_step = 1 if step is None else step
range_start = ((0 if range_step > 0 else length - 1) if start is None
else start if start >= 0
else max(length + start,0))
range_stop = ((length if range_step > 0 else -1) if stop is None
else min(stop,length) if stop >= 0
else length + stop)
for i in range(range_start,range_stop,range_step):
yield obj[i]
我想知道是否有一种方法可以利用Python的内置切片功能或某些库函数,而不必尝试显式地处理所有情况(如我在上文中所尝试的那样,无论是否正确)
有一些讨论here,但答案都涉及以下其中一项:
-
使用
itertools.islice
,但这不支持负值,而且也不是一种有效的方法来迭代具有较大start
或step
的切片可以在其中建立索引的地方 -
在内存中明确创建切片以对其进行迭代,而不是对原始对象进行迭代
-
对
range
的参数使用一些简单的表达式,该表达式适用于范围内的非负数,但不易泛化以涵盖所有情况
是否有避免这些问题的简洁方法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。