python - 迭代器相当于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 的内置切片功能或某些库函数,而不必尝试显式处理所有情况(正如我在上面尝试过的那样,无论是否正确)。
这里有一些讨论,但答案都涉及以下之一:
的使用
itertools.islice
,但这不支持负值,而且它不是一种有效的方法来迭代一个大的切片start
或step
可以索引的切片显式地在内存中创建一个切片以对其进行迭代,而不是对原始对象进行迭代
对 的参数使用一些简单的表达式
range
,它适用于范围内的非负数,但不容易概括为涵盖所有情况
有没有一种简洁的方法可以避免这些问题?
解决方案
推荐阅读
- ms-word - 如何使用内容控件 ID 检测光标进入和离开表格
- azure - 服务终结点是否始终是访问 Azure 上资源的最安全方式?
- c# - 如何获取客户端的浏览器信息?
- android - NoSuchMethodError: 没有接口方法 getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 在类 Ljava/util/Map 中;
- java - 有没有办法从 weblogic 管理服务器位置调用应用程序特定的属性文件?
- python - python烧瓶板-为什么我不能写?
- php - Payfort 提交中的签名不匹配
- java - 始终应用的方法的第一个模拟
- angular - 如何在 Angular 中使用向下和向上箭头键遍历自动建议选项
- angular - ng build :无法加载工作区配置文件