假设我在Python中有一个生成器,除了前10次迭代和最后10次迭代之外,我想遍历其中的所有内容。 itertools.islice支持这种分片操作的第一部分,但不支持第二部分。有没有简单的方法来实现这一点?索引形式生成器的末尾
2
A
回答
1
不仅没有简单的方法,而且根本没有办法,如果你想允许任何生成器(或任何可迭代的)。一般来说,无法知道自己是从发电机末端开始的10个项目,还是无法知道发电机是否结束。发电机一次只给你一件物品,并且不告诉你有多少物品“遗留”。你将不得不迭代整个生成器,保留最近10个项目的临时缓存,然后在发生器终止时(或者如果!)生成这些项目。
请注意“或如果”。发电机不一定是有限的。对于无限生成器来说,没有“最后”10个元素这样的事情。
2
像这样的东西可能会完成这项工作。编辑:增加使用deque每个评论。
from collections import deque
def generator():
for i in ['ignore'] * 10 + ['yield this'] * 10 + ['ignore'] * 10:
yield i
def func(mygenerator):
cache = deque()
for i, item in enumerate(mygenerator()):
if i < 10:
continue
cache.appendleft(item)
if len(cache) > 10:
yield cache.pop()
for i in func(generator):
print i
相关问题
- 1. 文件末尾的Rails生成器`inject_into_file`
- 2. 如何在PDF文件末尾生成索引?
- 3. 字段末尾的部分MySQL索引
- 4. 索引C数组的末尾
- 5. 从末尾对数组进行索引
- 6. 错误 - 索引超出列表末尾
- 7. 随机索引生成器
- 8. 删除/索引从浏览器URL末尾
- 9. 鼠尾草形式集成
- 10. 为什么Url.Action(“ActionName”)在生成的URL的末尾生成一个参数?
- 11. 在书的末尾创建定义/定理的索引
- 12. LINQ中的隐式索引或生成索引
- 13. 将动态生成的dijit追加到div的末尾
- 14. 附加标签对形式的URL的末尾选择
- 15. 将值添加到熊猫索引对象的末尾
- 16. 将第二个元素索引到数组的末尾?
- 17. 参数索引超出范围mysql在finally块的末尾
- 18. 如何打印对齐序列末尾的索引?
- 19. C++数组索引超过了数组的末尾
- 20. LaTex - BibTex:引文末尾的逗号
- 21. 输入稍后在链接末尾生成的用户ID
- 22. 达到自动生成(IDENTITY)字段值池的末尾
- 23. 在页面末尾生成不需要的空白空间
- 24. JS生成形式
- 25. 笛卡尔产品索引生成器
- 26. 如何在文本末尾设置制表索引和光标
- 27. 在每行末尾附加索引变量
- 28. list extend()以索引,不仅插入列表元素到末尾
- 29. 索引成圆形阵列
- 30. symfony管理生成器形式
我正在考虑类似的解决方案。如果速度很重要,则可能必须使用缓存的'Queue'对象。据我所知,列表并未针对从头开始重复插入进行优化。 –
使用'collections.deque'。它旨在允许在每一端快速访问值,所以'insert'(如'pushleft')和'pop'调用都会很快。这是'queue.Queue'(它是用于线程之间的通信)的基础数据结构。 – Blckknght
有些遗憾的是,'collections.deque'不能被覆盖来覆盖'popleft'(人们猜测会抛出元素),以产生一个元素,然后可以用'maxlen'参数来使用它。 ..然后你会有'mydeque(islice(iterable,None,10),10)'' –