python中的片的迭代器等价物?
获取此切片的迭代器等价物的惯用有效方法是什么python中的片的迭代器等价物?,python,iterator,slice,Python,Iterator,Slice,获取此切片的迭代器等价物的惯用有效方法是什么 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)
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的内置切片功能或某些库函数,而不必尝试显式地处理所有情况(正如我在上面尝试的,无论是否正确)
有一些讨论,但答案都涉及以下一个方面:
- 使用
,但这不支持负值,而且在可以索引的情况下,使用大itertools.islice
或start
迭代切片也不是一种有效的方法step
- 显式地在内存中创建一个切片,以便在其上迭代,而不是在原始对象上迭代
- 对
的参数使用一些简单的表达式,这适用于范围内的非负数,但不容易推广到涵盖所有情况范围
有没有一种简洁的方法可以避免这些问题?range()函数的工作原理与slice()类似。也许你能找到一个方法来使用它。@Blupper我看不到一个明显的简单方法-特别是,要处理许多情况(
None
或负索引,或超出范围索引),它需要知道len(obj)
。我只是对你在做什么有点困惑。为什么切片不是一种选择?在obj[start:stop:step]:中对x不起作用吗?纯迭代器不支持负索引,因为它的长度未知。@Blupper如果在obj[start:stop:step]中对x执行操作:
它会创建所有数据的副本,只是为了在其上进行迭代。