繁体   English   中英

re.finditer() 返回的可迭代 object 与在迭代之前将其类型转换为列表之间有什么区别。 PYTHON

[英]What is the difference between an iterating iterable object returned by re.finditer() and typecasting it to list before iterating. PYTHON

我正在解决关于hackerrank 的python 问题。 我遇到了以下代码通过的问题:

import re
s = input()
ss = input()
o = list(re.finditer(r'(?=' + ss + ')', s))
if o:
    for i in o:
        print((i.start() , i.start() + len(ss) - 1))
else:
    print((-1, -1))

但是以下一个失败了:

import re
s = input()
ss = input()
o = re.finditer(r'(?=' + ss + ')', s)
if o:
    for i in o:
        print((i.start() , i.start() + len(ss) - 1))
else:
    print((-1, -1))

您可以在第四行看到差异。 我无法理解两者之间的区别。

如果列表为空,则列表将评估为 False,如果不是,则评估为 True。

因此,如果o为空列表,则不输入此if

if o:

一个迭代器在被消费之前不知道它是否为空,所以它总是真的

参见例如:

list1 = []
list2 = [0]
iter1 = iter(list1)
iter2 = iter(list2)
>>> bool(list1)
False
>>> bool(list2)
True
>>> bool(iter1)
True
>>> bool(iter2)
True

这应该这样做:

>>> if re.finditer("a", ""):
...     print("Y")
... 
Y
>>> if list(re.finditer("a", "")):
...     print("Y")
... 
>>> 

从上面你可以看到,在没有匹配的情况下,生成器 object(迭代器)仍然通过条件(因为它不能评估为 False,一般来说,生成器只是对象,因此与空时为False的容器),而正如预期的那样,空列表不会。 生成器对象的boolean值为 True:

>>> bool(range(1))
True
>>> bool(re.finditer("a", ""))
True
>>> bool(iter([1,2,3]))
True

finditer返回一个callable_iterator的实例,而不是像列表这样的具体容器。 它的 boolean 值为True ,无论迭代器实际上是否可以产生任何值,因为在您迭代它之前,没有办法判断它是否会。

其他人已经解释了为什么它不起作用我想展示可能的解决方案而不list re.finditer返回的内容,即:

import re
s = input()
ss = input()
o = re.finditer(r'(?=' + ss + ')', s)
nothing = True
for i in o:
    nothing = False
    print((i.start() , i.start() + len(ss) - 1))
if nothing:
    print((-1, -1))

我只是将nothing设置为 True ,然后在for -loop 中将其设置为False 只有在o中至少有一个元素时才会执行循环体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM