【问题标题】:Iter() during loop Python循环Python期间的Iter()
【发布时间】:2019-07-02 19:17:52
【问题描述】:

我无法理解为什么 issup("oFB","FooBar") 返回 False。 iter(t) 在这个循环中表现如何?

参考这个 https://leetcode.com/problems/camelcase-matching/ https://leetcode.com/problems/camelcase-matching/discuss/270029/JavaC%2B%2BPython-Check-Subsequence-and-Regax

我猜iter(t)"FooBar" 开始,然后在下一次迭代中转到"ooBar",依此类推。

def issup(s, t):
    it = iter(t)
    return all(c in it for c in s)

【问题讨论】:

  • 不,iter 在容器上返回一个迭代器,或者如果您在迭代器上调用 iter,它应该只返回迭代器本身。这将是单程。
  • 这里不需要iter。只需使用return all(c in t for c in s)return set(s) <= set(t)
  • 另外,请不要提供链接来替代问题描述,请在问题中自己描述您试图解决的问题跨度>
  • @0x5453 确实,这取决于您要执行的操作,iter 这里会使此错误。因为迭代器是单遍的,它只会为x in it返回True恰好一次,所以如果s的长度大于1,函数将始终返回错误
  • iter 仅供一次性使用!一旦它被遍历,它里面就没有矿石元素了。 o in it 将迭代器推进到第四个位置,之后没有F。只有当s 中的字符在t 中以正确的顺序出现时,您的函数才会返回True。

标签: python python-3.x list loops


【解决方案1】:

iter(t) 返回一个迭代器,它返回t 的所有元素。所以它会返回"F""o""o""B""a""r"

但是,一个迭代器只能使用一次;一旦它返回了所有元素,它将为空。因此,生成器第一次执行c in it 时,它将逐步遍历迭代器,直到找到与c 值匹配的值。当它试图寻找下一个c 时,它将从上次中断的地方继续。如果其中任何一个没有找到匹配项,它将到达迭代器的末尾,并且以下c in it 测试都不会成功。

所以当您执行issup("oFB", "FooBar") 时,第一次迭代会找到第一个o。第二次迭代寻找F,但找不到它,因为我们已经超过了迭代器中的那个元素。此时,all() 返回False

许多 Python 错误是由于没有意识到迭代器只能单步执行一次。例如。像这样:

with open("filename") as f:
    for _ in range(10):
        for line in f:
            # do stuff

f 是文件行的迭代器。当您到达for line 循环的末尾时,其中没有任何内容,因此for _ 的下一次迭代将没有任何东西可以循环。在这种情况下,您实际上可以使用f.seek(0) 来修复它以倒带,但大多数迭代器都没有这样的东西。 file 迭代器的不同寻常之处在于它使用底层流的状态,而不是保持自己的状态。

【讨论】:

  • 非常感谢!我现在明白了。
  • 这是一个很好的答案。关于最后一部分的一个警告:文件是相当不寻常的迭代器,因为它们可以在它们到达末尾后使用seek(或者可能只是等待其他一些程序来扩展磁盘上的文件)。这在技术上违反了迭代器协议,该协议规定已用尽的迭代器应保持用尽状态。但我猜规则是用来打破的。这个答案是正确的,大多数迭代器都不是这样工作的。
猜你喜欢
  • 2018-12-20
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多