从 itertools.cycle 中提取列表

2024-02-08

我有一堂课,其中包含itertools.cycle我希望能够复制的实例。一种方法(我能想到的唯一方法)是提取初始可迭代对象(这是一个列表),并存储循环所在的位置。

不幸的是,我无法获取用于创建循环实例的列表,似乎也没有明显的方法来做到这一点:

import itertools
c = itertools.cycle([1, 2, 3])
print dir(c)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', 
 '__hash__', '__init__', '__iter__', '__new__', '__reduce__', 
 '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
 '__subclasshook__', 'next']

我可以想出一些合理的理由来解释为什么对于某些类型的输入迭代来说这是不允许的,但是对于元组甚至列表(可变性可能是一个问题),我不明白为什么它不会可能的。

有谁知道if可以从一个中提取非无限迭代itertools.cycle实例。如果没有的话有人知道吗why这个想法是坏的吗?


不可能。如果你看itertools.cycle代码你会发现它不存储序列的副本。它仅创建一个可迭代对象并将可迭代对象中包含的值存储在新创建的列表中:

static PyObject *
cycle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    PyObject *it;
    PyObject *iterable;
    PyObject *saved;
    cycleobject *lz;

    if (type == &cycle_type && !_PyArg_NoKeywords("cycle()", kwds))
        return NULL;

    if (!PyArg_UnpackTuple(args, "cycle", 1, 1, &iterable))
        return NULL;
    /* NOTE: they do not store the *sequence*, only the iterator */
    /* Get iterator. */
    it = PyObject_GetIter(iterable);
    if (it == NULL)
        return NULL;

    saved = PyList_New(0);
    if (saved == NULL) {
        Py_DECREF(it);
        return NULL;
    }

    /* create cycleobject structure */
    lz = (cycleobject *)type->tp_alloc(type, 0);
    if (lz == NULL) {
        Py_DECREF(it);
        Py_DECREF(saved);
        return NULL;
    }
    lz->it = it;
    lz->saved = saved;
    lz->firstpass = 0;

    return (PyObject *)lz;
}

这意味着在执行以下操作时:

itertools.cycle([1,2,3])

您创建的列表只有 1 个引用,该引用保存在循环使用的迭代器中。 当迭代器耗尽时,迭代器将被删除并创建一个新的迭代器:

    /* taken from the "cycle.next" implementation */
    it = PyObject_GetIter(lz->saved);
    if (it == NULL)
        return NULL;
    tmp = lz->it;
    lz->it = it;
    lz->firstpass = 1;
    Py_DECREF(tmp);   /* destroys the old iterator */

这意味着完成一个循环后列表将被销毁。

无论如何,如果您需要访问此列表,只需在调用之前在某处引用它即可itertools.cycle.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 itertools.cycle 中提取列表 的相关文章

随机推荐

  • elf 格式的可执行文件和可重定位文件有什么区别?

    elf 格式的可执行文件和 elf 格式的可重定位文件有什么区别 如您所知 每个编译后的可执行文件都是具有相对地址和绝对地址的二进制文件 因此可重定位格式是一种格式 其中函数和其他符号仍然具有名称定义 换句话说 函数和变量不绑定到任何特定地
  • 如何在 IntelliJ IDEA 13(或 WebStorm)上远程运行 mocha 测试?

    IntelliJ IDEA 13 通过 Node js 插件对 Mocha 测试提供了非常出色的支持 https www jetbrains com idea webhelp running mocha unit tests html ht
  • python udp客户端超时机制

    如果服务器套接字中生成的兰特数小于4 我的客户端套接字将暂停接收数据 我需要设置超时机制以允许客户端套接字检测到 超时 然后继续发送消息 在我运行服务器套接字然后运行客户端套接字后 出现以下错误消息 Traceback most recen
  • FirebaseTableViewDataSource 在用户注销和登录时崩溃

    我的应用程序有一个 UITableViewController 它使用 FirebaseTableViewDataSource 来自 FirebaseUI 该表正确显示了用户添加书签的帖子 但是当我注销该用户并登录另一个用户时 应用程序崩溃
  • JAVA 无法从另一个类中绘制到 JFrame 上

    我知道这是我的错误 我的问题是为什么这不起作用我错过了什么我可以称之为我把它放在一个方法而不是一个类所以我假设他们的第三个类有问题 第 1 类 package assignment pkg1 java import java awt Col
  • 打开模态表单,其中包含从另一个 ngx-formly 表单从 ngx-formly 创建的表单

    我目前正在使用 ngx formly 从 JSON 动态创建一堆 Angular 表单 效果非常好 我有一个特殊的用例 其中表单上的自定义按钮应该在单击时打开一个包含另一个表单的模式对话框 该对话框还包含使用 ngx formly 创建的表
  • 推送通知 - 使用 SceneDelegate 在通知点击时推送 ViewController

    在 iOS 13 之前 导航控制器和根视图是在 AppDelegate 中定义的 然而 在 iOS 13 中 Apple 引入了 SceneDelegate 它接管了这些视图函数的处理 然而 AppDelegate 仍然处理诸如本地通知处理
  • 在 akka.net actor{} 表达式中等待 F# 异步任务

    是否可以在 Akka Net actor 计算中等待 不阻塞 Async 我想实现类似于以下内容的目标 actor let msg mailbox Receive match msg with Foo gt let x async Retu
  • 为什么在缩小大框时仍然出现滚动条?

    简单来说 我试图使用 CSS 变换属性将一个大框 当浏览器全屏时使用 缩放为一个较小的框 该框已正确缩放 但浏览器仍显示滚动条 就好像未缩放一样 我不想关闭溢出 我希望我错过了一些东西 我的问题的一个小提琴 注意垂直滚动条 http jsf
  • Django 错误 u"'polls" 不是已注册的命名空间

    昨天我正在使用本教程开发我的第一个应用程序 这是一个民意调查和选择应用程序 第一页显示问题 当您单击问题时 它会显示您可以对其进行投票的选项 昨天有一些很棒的人帮助了我 并告诉我使用命名空间 我已阅读命名空间教程并尝试应用我的知识 到该场景
  • 获取数组中的第一列

    我有一张工作表 需要获取某一列的值 电子邮件地址 在本例中为 C 假设该列中有三封电子邮件 日志给了我 电子邮件1 电子邮件2 电子邮件3 为了继续执行脚本 我需要让数组看起来像这样 电子邮件1 电子邮件2 电子邮件3 所以只是没有外括号
  • Highcharts - 处理重叠区域样条点上的点击

    每次单击系列中的某个点时 我都需要获取点详细信息 但单击区域样条线重叠点不会触发 单击 事件 仅当该系列的点位于前面时才会触发 plotOptions series events click function event alert thi
  • 你好,是否可以在 Eclipse 下禁用/不显示向导

    是否可以在 Eclipse 下禁用 不显示向导 例如 文件 gt 新建 gt 向导名称同样的方法 文件 gt 新建 gt 其他 gt 选择向导 gt 向导类别名称 gt 向导名称 我可以通过 propertyTesters 使向导不显示在
  • 指南针(红宝石)编码错误

    我在 Ubuntu Oneiric 上安装了 Compass 0 12 一个 ruby gem 没有任何问题 我已经更新为精确格式化 并保留 home 所以我需要重新安装 ruby 1 9 3 现在 当我编译 SCSS 文件时 出现此错误
  • 如何创建 MSI 设置?

    多年来我一直使用 Inno Setup 为所有 Delphi 工具创建设置 现在 一些用户更想要 MSI 安装包 这样他们就可以将安装程序从中央服务器部署到所有工作站 我如何创建一个 我必须购买 Visual Studio 或其他产品吗 您
  • QTP:如何从函数返回多个值

    我正在尝试编写一个函数 它可以从具有 2 个参数的函数返回多个值 eg function sample function arg1 arg2 Some code passenger list1 0 name1 list1 1 age1 li
  • Mac X11 有 XTEST 扩展吗?

    所以我把一些 X 程序移到了 mac 上 然后我得到了 Error XTEST extension unavailable on null 来自 xdotool OS X X11 是否附带 XTEST 如果没有的话有办法添加吗 在终端中运行
  • WiX 自定义许可证文件:安装程序显示带有 < > 的链接

    我创建了一个带有自定义许可证文件的 WiX 3 5 设置 将其放入 wxs file
  • 无法安装 Facebook 6.4.2 软件包

    我正在尝试安装 facebook C sdkNuGet 控制台进入我的视窗电话 8 app NET框架4 0但它给出了一个错误 详细信息如下 PM gt Install Package Facebook Successfully insta
  • 从 itertools.cycle 中提取列表

    我有一堂课 其中包含itertools cycle我希望能够复制的实例 一种方法 我能想到的唯一方法 是提取初始可迭代对象 这是一个列表 并存储循环所在的位置 不幸的是 我无法获取用于创建循环实例的列表 似乎也没有明显的方法来做到这一点 i