首页 > 解决方案 > re.finditer() 返回的迭代可迭代对象与在迭代之前将其类型转换为列表之间有什么区别。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))

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

标签: pythonlistiterator

解决方案


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

因此,如果是空列表if,则不会输入:o

if o:

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

参见例如:

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

推荐阅读