2012-09-10 22 views
-1

假設我有以下代碼:正則表達式可調用迭代器獲取長度

>>> 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,或者更一般地說,我如何得到調用迭代器的長度所以我可以知道在解析它們之前是否有任何結果。

回答

4

您需要打開可迭代成一個列表來取得長度:

len(list(a)) 

注意,這消耗的迭代,因此你可能無法再遍歷它。呼籲它len()能夠重複使用列表中仍所有元素之前,中介存儲list(a)結果:

a = list(a) 
len(a) 
+0

該死的,我只拍自己的腳,這樣一個簡單的解決方案,我被撕裂我的頭髮出來了。謝謝:) –

+3

在'list(a)'消耗太多內存並且你真的需要它的長度的情況下,使用簡單而快速的'sum(1 for j in a)'。 – eumiro

+0

@eumiro這不好,因爲你空了一個,然後就不能再使用它了。事實上 - 因爲它被清空,所以a和a本身的列表之間沒有太大的空間差別,因爲一旦它被讀取到列表中,它就會減少爲一個shell。 –