如何为 Python 迭代器编写分页器?

2023-11-22

我正在寻找一种“翻阅”Python 迭代器的方法。也就是说,我想包装给定的迭代器iter and 页面大小使用另一个迭代器,它将从 iter 返回项目作为一系列“页面”。每个页面本身就是一个迭代器,最多可达页面大小迭代。

我翻阅了迭代工具我看到的最接近的是itertools.islice。在某些方面,我想要的是相反的itertools.链-- 我不想将一系列迭代器链接到一个迭代器中,而是想将迭代器分解为一系列较小的迭代器。我本来希望在 itertools 中找到一个分页函数,但找不到。

我想出了以下寻呼机课程和演示。

class pager(object):
    """
    takes the iterable iter and page_size to create an iterator that "pages through" iter.  That is, pager returns a series of page iterators,
    each returning up to page_size items from iter.
    """
    def __init__(self,iter, page_size):
        self.iter = iter
        self.page_size = page_size
    def __iter__(self):
        return self
    def next(self):
        # if self.iter has not been exhausted, return the next slice
        # I'm using a technique from 
        # https://stackoverflow.com/questions/1264319/need-to-add-an-element-at-the-start-of-an-iterator-in-python
        # to check for iterator completion by cloning self.iter into 3 copies:
        # 1) self.iter gets advanced to the next page
        # 2) peek is used to check on whether self.iter is done
        # 3) iter_for_return is to create an independent page of the iterator to be used by caller of pager
        self.iter, peek, iter_for_return = itertools.tee(self.iter, 3)
        try:
            next_v = next(peek)
        except StopIteration: # catch the exception and then raise it
            raise StopIteration
        else:
            # consume the page from the iterator so that the next page is up in the next iteration
            # is there a better way to do this?
            # 
            for i in itertools.islice(self.iter,self.page_size): pass
            return itertools.islice(iter_for_return,self.page_size)



iterator_size = 10
page_size = 3

my_pager = pager(xrange(iterator_size),page_size)

# skip a page, then print out rest, and then show the first page
page1 = my_pager.next()

for page in my_pager:
    for i in page:
        print i
    print "----"

print "skipped first page: " , list(page1)   

我正在寻找一些反馈并有以下问题:

  1. 是否已有寻呼机迭代工具它为我忽略的寻呼机提供服务?
  2. 克隆 self.iter 3 次对我来说似乎很笨拙。一种克隆是检查 self.iter 是否还有更多项目。我决定去亚历克斯·马尔泰利(Alex Martelli)建议的一种技术(意识到他写了一个包裹技术)。第二个克隆是为了使返回的页面独立于内部迭代器(自迭代器)。有没有办法避免产生 3 个克隆?
  3. 有没有更好的方法来处理停止迭代除了捕获它然后再次引发它之外还有例外吗?我很想完全不去抓住它,让它冒泡。

谢谢! -雷蒙德


Look at grouper(), 来自itertools recipes.

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 Python 迭代器编写分页器? 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • Nuget 找不到更新的依赖项

    我刚刚在 ASP 5 MVC 6 beta8 中创建了一个新项目和一个用于测试的兼容类库 问题出现在我打算用于测试的这个新的 Web 类库 项目中 这是我的project json 的样子 version 1 0 0 description
  • Grails hasOne 与belongsTo

    要在 Grails 中创建一对一关系 我可以这样做 class Person static hasOne address Address 在这种情况下 地址表拥有其个人的密钥 我还可以这样做 class Address static bel
  • 将焦点设置在android中listview的任何项目上

    我有一个列表视图 其中包含文本视图作为其元素 现在我希望在启动应用程序时自动聚焦列表的第一项 当我单击其他视图 例如按钮 时 如何将焦点设置在列表中的任何项目上 设置选择和设置焦点是两个不同的事情 如果您只想将选择设置为某个项目 那么您可以
  • 由于 CORS 限制,无法使用 firebase 进行本地测试

    我当前的用例很简单 我只需要向我本地开发的云函数发出post请求 问题是 当我开火时 firebase serve 托管部署在本地主机 5000 并且云功能部署在本地主机 5001 由于端口不同 这两者来自不同的来源 因此 当浏览器发送初始
  • 如何处理对数图中的零

    问题 我想使用 ggplot2 将数据绘制在 y 轴上具有对数刻度的折线图中 不幸的是 我的一些价值观一路下降到零 数据表示依赖于某些参数的特征的相对出现 当在样本中没有观察到该特征时 值为零 这意味着它很少出现 或者实际上从未出现 这些零
  • Android游戏RPG库存系统

    我使用 ArrayList 作为我的 库存 我无法找到一种方法来添加多个相同的物品而不占用 库存 中的位置 例如 我在库存中添加了一瓶药水 现在我添加了另一种药水 但这次不是在库存中添加另一种药水 而是应该显示我有 药水 x 2 同时只占用
  • 获取 Urllib2.Request 的请求标头?

    有没有办法从使用 Urllib2 创建的请求中获取标头或确认使用 urllib2 urlopen 发送的 HTTP 标头 查看请求 和响应标头 的一种简单方法是启用调试输出 opener urllib2 build opener urlli
  • llvm JIT 将库添加到模块

    我正在开发一个使用 LLVM 的 JIT 该语言有一个用 C 编写的小型运行时 我使用 clang 将其编译为 LLVM IR clang runtime cu cuda gpu arch sm 50 c emit llvm 然后加载 bc
  • Hadoop 流 - 从减速器输出中删除尾随选项卡

    我有一个 hadoop 流作业 其输出不包含键 值对 您可以将其视为仅值对或仅键对 我的流式减速器 一个 php 脚本 正在输出由换行符分隔的记录 Hadoop 流处理将此视为没有值的键 并在换行符之前插入一个制表符 这个额外的选项卡是不需
  • 获得 Cassandra Writes 背压的最佳方法是什么?

    我有一项服务以我控制的速率消耗队列中的消息 我做了一些处理 然后尝试通过 Datastax Java 客户端写入 Cassandra 集群 我已经设置了我的 Cassandra 集群maxRequestsPerConnection and
  • 使用友元函数进行前向声明:不完整类型的使用无效

    include
  • 如果我不需要用户访问令牌,如何使用请求从 Python 连接到 Facebook Graph API?

    我正在尝试找到如何使用我最喜欢的 Facebook Graph API 的最简单方法Requests图书馆 问题是 我发现的所有例子都是关于获取用户访问令牌 关于重定向和用户交互 我所需要的只是应用程序访问令牌 我不处理任何非公开数据 因此
  • std::list 应该被弃用吗?

    根据 Bjarne Stroustrup 的说法slides从他的2012 年本土化主题演讲 在a中插入和删除std list在现代硬件上效率非常低 矢量节拍列表大量用于插入和删除 如果这确实是真的 那么还剩下哪些用例std list 那不
  • DataTrigger 不会更改 Text 属性

    我正在尝试在样式上使用数据触发器来更改属性 符合 最小 完整且可验证的示例 要求 要重现 首先在 Visual Studio 中创建一个 WPF 应用程序 在 App xaml cs 内 using System ComponentMode
  • 405(方法不允许)并被 CORS 策略阻止

    我有 Asp Net Core 3 WebApi 项目 其 UI 基于客户端的 Angular 7 2 1 当使用 Postman 或仅使用 URL 时 我可以使用 GET 和 POST 而不会出现任何特定错误 当通过 Angular Ch
  • 在合并列中将两个数据帧与 pd.NA 合并会产生“TypeError:NA 的布尔值不明确”

    使用 Pandas 1 0 1 如果以下情况我无法合并 df df merge df2 on some column yields File home torstein code fintechdb Sheets sheets gild p
  • 为什么不在单元测试中访问数据库?

    我在博客中读到 单元测试运行时不应访问数据库 我理解这个理论 但是说我有复杂的存储过程 这是业务领域操作的一部分 我想为与业务操作相关的代码编写一组单元测试 但是如果我模拟数据库 我会感觉我没有 真正 测试属于操作的所有部分 例如 有人可能
  • 从另一个应用程序以编程方式提交并终止 Spark 应用程序

    我想知道是否可以submit monitor kill从另一个服务激发应用程序 我的要求如下 我写了一个服务 parse用户命令 翻译他们变成可以理解的论据 to an 已经准备好的 Spark SQL 应用程序 使用以下命令将应用程序连同
  • Crockford 原型继承的小缺点

    只是在 JS 中尝试不同的继承技术 并发现 Crockford 的原型继承模式有些令人不安的地方 function object o function F F prototype o return new F var C P foo bar
  • 如何为 Python 迭代器编写分页器?

    我正在寻找一种 翻阅 Python 迭代器的方法 也就是说 我想包装给定的迭代器iter and 页面大小使用另一个迭代器 它将从 iter 返回项目作为一系列 页面 每个页面本身就是一个迭代器 最多可达页面大小迭代 我翻阅了迭代工具我看到