【问题标题】:How to make iterator to start from a specific index?如何使迭代器从特定索引开始?
【发布时间】:2014-01-15 10:34:52
【问题描述】:

我想对来自特定索引的字符串使用迭代器,该索引不是开头,而不使用切片。有没有办法做到这一点?我正在使用 python 3.2

编辑: 我需要编写一个生成器函数,该函数获取 2 个参数:一个可迭代的迭代器,它由可能是无限的字符和一个模式组成。 该函数需要返回迭代中模式开始出现的索引。对于剩下的问题,我将生成器命名为 g。 如果pattern长度为m,则func的效率应该是O(m)

例如:字符串:abababab,模式:abab

所以我们会得到:

下一个(g)

0

下一个(g)

2

下一个(g)

4

【问题讨论】:

  • 因为我必须多次这样做,它不会有效率
  • @CnR 你为什么这么认为?您是否对效率进行了基准测试?
  • 您是否尝试过自己解决问题?您可以提供的任何代码都会对帮助您的人有所帮助。
  • 你研究过吗?你发现了什么?
  • 除非字符串很大,否则我怀疑你能比字符串切片更快。

标签: python string python-3.x iterator


【解决方案1】:

以下生成器函数将返回您请求的输出:

def geniter(instring, pattern):
    start=0
    while start < len(instring):
        nxtidx = instring.find(pattern, start)
        if nxtidx != -1:
            yield nxtidx
            start = nxtidx + 1
        else:
            start = len(instring)

您可以使用:g = geniter('abababab', 'abab') 调用它,然后使用对 next(g) 的重复调用进行迭代。但是,我认为我不一定能保证它会以 O(m) 的效率运行;关于那个问题,我只是不知道。

【讨论】:

  • 你的答案中的字符串是有限的,它不一定在问题中
  • 是的,我被这个术语弄糊涂了;谷歌搜索“Python 无限字符串”不会返回很多命中。 “无限字符串”到底是什么意思?即使您打开一个 IO 流(我想这可能在某种意义上提供了“无限”长度的潜力),您最终总是会通过 read() 方法访问底层数据,该方法返回有限数量的字节在实际实践中一次,因此无论您做什么,您的字符串输入最终都会被 IO 库分解为有限长度的段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2020-08-09
  • 2014-03-04
  • 2018-12-04
相关资源
最近更新 更多