生成器在输入迭代器的开头和结尾保留占位符完好无损

2024-01-05

我们以一个列表为例:

a = [255, 255, 1, 255, 255, 255, 1, 2, 255, 255, 2, 255, 255, 3, 255, 3, 255, 255, 255]

255是有特殊价值在里面的。这是一个占位符。

我制作了一个生成器来替换列表中的一些占位符。它按预期工作。

但我不需要处理开始占位符[255, 255和结尾占位符255, 255, 255]并将它们完好无损地交出。

所以,我尝试修改生成器来解决这个问题:

Python 2.7

from __future__ import print_function
from  itertools import tee, izip, ifilterfalse

def replace(iterable,placeholder=255):
    it = enumerate(iterable) #the position is needed for the logic for the middle of the list
    it = ifilterfalse(lambda x: x[1]==placeholder, it) #create an iterator that deletes all the placeholders
    for i,(left,right) in enumerate(window(it,2)): #Slide through the filtered list with the window of 2 elements
        if i==0: #Leaving the beginning placeholders intact
            for j in range(left[0]):
                yield placeholder

        #SOME LOGIC FOR THE MIDDLE OF THE LIST (it works well)

    #Need to leave the trailing placeholders intact.

转换为列表的临时值只是为了便于理解代码:

>>>iterable
[255,1,255,255,1,255,255,255,2,2,255,255,255,2,2,3,255,255,255,3,255,255]

>>>it = enumerate(iterable)
[(0, 255), (1, 1), (2, 255), (3, 255), (4, 1), (5, 255), (6, 255), (7, 255), (8, 2), (9, 2), (10, 255), (11, 255), (12, 255), (13, 2), (14, 2), (15, 3), (16, 255), (17, 255), (18, 255), (19, 3), (20, 255), (21, 255)]

>>>it = ifilterfalse(lambda x: x[1]==placeholder, it)
[(1, 1), (4, 1), (8, 2), (9, 2), (13, 2), (14, 2), (15, 3), (19, 3)]

>>>list(enumerate(window(it,2)))
[(0, ((1, 1), (4, 1))), (1, ((4, 1), (8, 2))), (2, ((8, 2), (9, 2))), (3, ((9, 2), (13, 2))), (4, ((13, 2), (14, 2))), (5, ((14, 2), (15, 3))), (6, ((15, 3), (19, 3)))]

所以,正如你所看到的,list(enumerate(window(it,2)))包含前导非占位符值的索引(0, ((**1**, 1), (4, 1))),,但它不包含初始迭代器有多少个尾随占位符的信息:list(enumerate(window(it,2)))以此值结束(6, ((15, 3), (**19**, 3)))它只有最后一个非占位符值的索引,它不提供还剩多少占位符的信息。

我设法通过依赖来处理主要占位符it = enumerate(iterable)它产生初始迭代器值的位置,该值持续存在于第一个产生的值中ifilterfalse.

但我花了很多时间试图弄清楚如何对尾随占位符做同样的事情。问题是ifilterfalse只是吞掉最后一个占位符值enumerate(iterable)我看不出有什么办法可以访问它们(自从第一次生成值以来,领先的占位符是可能的)ifilterfalse包含的值的索引enumerate(iterable)).

Question

纠正此代码以处理尾随占位符的最佳方法是什么?

因为目标不是无论如何都要创建代码(我已经done it https://stackoverflow.com/questions/7745367/how-to-fill-the-start-and-the-end-of-a-unique-entry-with-the-same-value-in-numpy/7746150#7746150使用不同的技术),我想通过对代码进行一些修改来解决任务,而不是完全重写它。

这更像是一种训练,而不是真正的任务。

附加信息

window代码来自here https://stackoverflow.com/questions/7636004/python-split-string-in-moving-window/7636587#7636587.

我的代码几乎与this https://stackoverflow.com/questions/7745367/how-to-fill-the-start-and-the-end-of-a-unique-entry-with-the-same-value-in-numpy/7747020#7747020@nye17 回答。但在这段代码中,作者对初始列表进行了就地修改。我想创建一个生成器,它将产生与该代码中的结果列表相同的值。

此外,我希望我的生成器接受任何可迭代对象作为参数,而不仅仅是列表(例如,它可以接受从文件中一一读取值的迭代器)。仅使用列表作为参数,任务变得更简单,因为我们可以从末尾扫描列表。

这不是我生活中必须解决的真正任务。这只是为了一次训练。

完整代码 http://codepad.org/9UJ9comY http://codepad.org/9UJ9comY


def replace(it, process, placeholder):
    it = iter(it)
    while True:
        item = it.next()
        if item == placeholder:
            yield item
        else:
            yield process(item)
    pcount = 0
    try:
        while True:
            item = it.next()
            if item == placeholder:
                pcount += 1
            else:
                for i in range(pcount):
                    yield process(placeholder)
                pcount = 0
                yield process(item)
    except StopIteration:
        for i in range(pcount):
            yield placeholder

像这样使用它:

>>> a = [0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 2, 0, 0, 3, 0, 3, 0, 0, 0]
>>> [x for x in replace(a, lambda n: n+20, 0)]
[0, 0, 21, 20, 20, 20, 21, 22, 20, 20, 22, 20, 20, 23, 20, 23, 0, 0, 0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成器在输入迭代器的开头和结尾保留占位符完好无损 的相关文章

随机推荐

  • 超级模糊纹理 - XNA

    当我近距离观察纹理时 我的纹理似乎变得非常模糊 我正在创建一个类似 Minecraft 的地形 我希望纹理能够像素化 就像它是制作出来的一样 而不是 XNA 尝试为我平滑它 它的显示方式如下 任何建议将不胜感激 它与抗锯齿无关 它与硬件如何
  • JS 对象按键顺序

    即使将新值分配给某个键 javascript 是否也能保证保留对象的键序列 例如 如果我有以下对象 var Object keyX value1 keyB value2 keyZ value3 如果我使用迭代键for in 我得到正确的顺序
  • 向 Magento 中的属性选项添加新值

    我正在尝试使用脚本向 Magento 中的属性选项添加新值以加快该过程 因为我有 2 000 多个制造商 这是我用来执行此任务的一段代码 创建自定义模块 使用模块创建器 http www magentocommerce com extens
  • JAXBContextFactory 地狱 - java.lang.ClassNotFoundException:com.ibm.xml.xlxp2.jaxb.JAXBContextFactory

    我在我的开发环境中不断收到以下错误 我用 火星日食 4 5 1 Oracle JDK 1 7 内部版本 1 7 0 79 b15 或 1 8 内部版本 1 8 0 65 b17 Apache Ant 运行代码以及 Eclipse 运行代码
  • ELF 格式操作

    我有一个要求 我想关联一个index与一个文件 以某种格式 我想知道我是否可以进行任何 ELF 操作 并且仍然确保保持一致性 以便该文件在 Linux 上正常工作 这里的想法是创建一种文件格式 可以通过某个 API 自定义 查询该文件格式以
  • GWT - 如何在超级开发中查看java异常堆栈跟踪?

    我正在使用 GWT Super Dev 并在 Chrome 中激活了源映射 尽管我可以在 源 选项卡中看到 Java 类 但我不知道如何查看未处理异常的完整堆栈跟踪 那么我该怎么做呢 有一个悬而未决的问题 http code google
  • 给定一个数组 [a1b2c3d4] 转换为 [abcd1234]

    限制条件 O 1 空间 准时 这不是一个家庭作业问题 只是我遇到的一个有趣的问题 以下是我能想到的一些解决方案 但在给定的限制下没有任何解决方案 Method 1 具有 O n 内存 递归地将数组分为两部分 继续划分直到每个子问题的大小 对
  • 是否可以构建一个交互式 C shell?

    我只是想知道这是否可以使用 Python Java 或 C 我正在寻找类似 IPython for Python 的东西 是的 这样的东西已经存在 你只需要用谷歌搜索即可 Ch http en wikipedia org wiki Ch i
  • 如何在从另一个活动返回时保留 Recyclerview 的滚动位置?

    我看到了很多关于这个主题的相关问题 但没有一个对我有帮助 我正在使用一个交错网格布局对于我的 RecyclerView 显示cards 每个 CardView 都会打开一个新活动 我面临的问题是 在从该新活动返回时 RecyclerView
  • React - 无法使用 CSS 模块设置 React 路由器导航链接的活动状态样式

    Goal 我正在尝试使用 css 模块将样式应用到侧栏中的活动路线 但是我想保留基本样式 分配 2 个类 我试过这段代码
  • x 轴上时间戳的格式

    我正在尝试格式化天气数据图中的 x 轴 我对 y 轴很满意 但我所有将 x 轴变成合适的 人类可读格式的尝试到目前为止都不起作用 因此 经过几个小时的尝试和错误 我希望对您有所帮助 我想要实现的目标 最后 我希望每 30 分钟有一个刻度线
  • 如何在 Windows 上更新 npm?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 I tried this http davidwalsh name upgrade no
  • 从 python **快速** 截取屏幕截图

    A PIL Image grab 大约需要0 5秒 这只是将数据从屏幕获取到我的应用程序 而不需要我进行任何处理 FRAPS http www fraps com 另一方面 可以拍摄高达 30 FPS 的屏幕截图 有什么方法可以让我在 Py
  • open_basedir, File() 不在允许的路径内

    我在使用安装在 Media Temple DV 上的 Laravel 时遇到问题 tempnam open basedir restriction in effect File is not within the allowed path
  • 如何使用 PCL 打印

    我有 Xerox workcenter 7120 这台打印机位于网络上 我想打印pdf文件与PCL命令来自Linux主持人 我的打印机支持PCL 但我不知道如何在打印机上发送打印作业PCL 我找到了这个文件如何解释所有PCL命令pcl命令施
  • 在GCS存储桶名称中使用project-id有什么风险?

    我一直在我的 GCS 存储桶名称中使用项目 ID 作为前缀 以便轻松获得唯一的名称 当我阅读时GCS 最佳实践 https cloud google com storage docs best practices naming 它明确表示不
  • 参考:为什么我使用 json_encode 编码的“特殊”Unicode 字符很奇怪?

    当使用 特殊 Unicode 字符时 它们在编码为 JSON 时会变成奇怪的垃圾 php gt echo json encode foo gt 馬 foo u99ac 为什么 我的编码有问题吗 This is a reference que
  • Rails 3:无需导入即可访问 twitter bootstrap 变量 + mixins

    我是第一次使用 Rails 3 尤其是 asset pipeline 和 less rails bootstrap 所以我可能会在这里遗漏一些非常基本的概念 我尝试了两种将 Twitter bootstrap CSS 包含到我的项目中的方法
  • 为什么在 WebApi 控制器操作后没有人处置 DbContext?

    我知道各种教程以及针对目标的完整示例WebApi Entity Framework 甚至来自微软 WebApi像这样的控制器 public HttpResponseMessage GetInternet int id var context
  • 生成器在输入迭代器的开头和结尾保留占位符完好无损

    我们以一个列表为例 a 255 255 1 255 255 255 1 2 255 255 2 255 255 3 255 3 255 255 255 255是有特殊价值在里面的 这是一个占位符 我制作了一个生成器来替换列表中的一些占位符