Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
re.finditer()返回的迭代iterable对象与在迭代之前将其类型转换为list有什么区别。python_Python_List_Iterator - Fatal编程技术网

re.finditer()返回的迭代iterable对象与在迭代之前将其类型转换为list有什么区别。python

re.finditer()返回的迭代iterable对象与在迭代之前将其类型转换为list有什么区别。python,python,list,iterator,Python,List,Iterator,我在解决一个关于hackerrank的问题。我遇到了一个问题,其中通过了以下代码: 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 = inp

我在解决一个关于hackerrank的问题。我遇到了一个问题,其中通过了以下代码:

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 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")
... 
>>> 
从上面可以看出,在没有匹配的情况下,生成器对象(迭代器)仍然会传递条件(因为它不能计算为False,一般来说,生成器只是对象,因此与空时为False的容器相比总是有点真实),而空列表则不会。生成器对象的
布尔值为真:

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

finditer
返回
可调用迭代器的实例,而不是像列表那样的具体容器。它的布尔值为
True
迭代器是否能够实际生成任何值,因为在对它进行迭代之前,无法判断它是否会生成任何值。

其他人已经解释了它不起作用的原因。我想展示可能的解决方案,而不必列出
列表
-ing
关于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,然后在
中为
-loop设置
False
。只有当
o

中至少有一个元素时,才会执行循环体,即使使用(IMO)相当松散的类型转换定义,这也不是类型转换<代码>列表(re.finditer(…)
通过迭代相当于延迟函数调用的内容来构建一个全新的列表。您并不是简单地将一个值视为另一个类型。