【问题标题】:regular expression callable iterator get length正则表达式可调用迭代器获取长度
【发布时间】:2012-09-10 12:13:53
【问题描述】:

假设我有以下代码:

>>> a = re.finditer("(?P<char>\w)","hello world")
>>> for i in a:
    print i.groupdict()


{'char': 'h'}
{'char': 'e'}
{'char': 'l'}
{'char': 'l'}
{'char': 'o'}
{'char': 'w'}
{'char': 'o'}
{'char': 'r'}
{'char': 'l'}
{'char': 'd'}

如您所见,有结果,一切都很棒!但是,我希望能够知道len(a),所以我会这样做:

>>> len(a)
Traceback (most recent call last):
  File "<pyshell#79>", line 1, in <module>
    len(a)
TypeError: object of type 'callable-iterator' has no len()

我的问题是,我如何获得 a 的长度,或者更一般地说,我如何获得 callable-iterator 的长度,以便在解析它们之前知道是否有任何结果。

【问题讨论】:

    标签: python regex iterator


    【解决方案1】:

    你需要把iterable变成一个列表来获取长度:

    len(list(a))
    

    请注意,这消耗可迭代对象,因此您可能无法再次对其进行迭代。在调用len() 之前将list(a) 结果存储在中介中,以便能够重用列表中的所有元素:

    a = list(a)
    len(a) 
    

    【讨论】:

    • 该死的,我应该在脚上开枪,这么简单的解决方案,我把头发扯掉了。谢谢:)
    • 如果list(a)消耗太多内存而你真的只需要它的长度,请使用简单快速的sum(1 for j in a)
    • @eumiro 那不好,因为你清空了 a,然后就不能再使用它了。事实上 - 因为它被清空了,a 的列表和 a 本身之间没有太大的空间差异,因为一旦它被读取到一个列表中,它就只剩下一个 shell。
    • @InbarRose:这就是为什么eumiro说“你真的只需要它的长度”
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2016-05-13
    • 2012-07-25
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多