【问题标题】:What is the difference between an iterating iterable object returned by re.finditer() and typecasting it to list before iterating. PYTHONre.finditer() 返回的迭代可迭代对象与在迭代之前将其类型转换为列表之间有什么区别。 PYTHON
【发布时间】:2021-01-04 12:55:37
【问题描述】:

我正在解决关于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))

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

【问题讨论】:

  • 即使使用(IMO)相当松散的类型转换定义,这不是类型转换。 list(re.finditer(...)) 通过迭代相当于延迟函数调用的内容来构建一个全新的列表。您不会简单地将一个值视为另一种类型。

标签: python list iterator


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      应该这样做:

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

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

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

      【讨论】:

        【解决方案4】:

        其他人已经解释了为什么它不起作用我想展示没有list的可能解决方案-ing 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 中至少有一个元素时才会执行循环体。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-14
          • 2014-04-26
          • 2017-12-30
          • 2015-07-23
          • 2011-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多