2013-10-04 25 views
20
>>> n = [1,2,3,4] 

>>> filter(lambda x:x>3,n) 
<filter object at 0x0000000002FDBBA8> 

>>> len(filter(lambda x:x>3,n)) 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    len(filter(lambda x:x>3,n)) 
TypeError: object of type 'filter' has no len() 

私は得たリストの長さを得ることができませんでした。だから私はこのように、それを変数に保存...Pythonの "フィルター"オブジェクトの長さを見つける方法

>>> l = filter(lambda x:x>3,n) 
>>> len(l) 
Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    len(l) 
TypeError: object of type 'filter' has no len() 

代わりのループを使用してみました、これの長さを取得する方法はありますか?

+0

ジェネレータがどれだけ多くのオブジェクトを生成するかを知る方法はありません。最適化を気にするならば、先験的な情報を使って処理を高速化することができます。つまり、あなたのリストがソートされていることがわかっているなら、 'index(3)'の下の項目を破棄することができます。 – roippi

答えて

39

フィルタオブジェクトを何とか反復処理する必要があります。一つの方法は、それをリストに変換することです:

l = list(filter(lambda x: x > 3, n)) 

len(l) # <-- 

しかし、それはリスト内包してより簡単にこれを行う可能性があるので、最初の場所でfilter()を使用してのポイントを破るかもしれません:

l = [x for x in n if x > 3] 

再び、len(l)は長さを返します。

+0

これは最も簡単な方法ですが、実際には適切な方法ではありません。私はAl Hooとtsoの答えを好む。 Pythonが内部的に還元方法をサポートしていなかったのは残念です! – Ben

8

パイソン3 docs「は 関数がtrueを返すための反復可能なのこれらの要素から反復子を構築します。」がイテレータ

を返す言います

python 2では、リストを返しました。hereを参照してください。 フィルタオブジェクトの長さを調べるには、フィルタオブジェクトを反復処理する必要があります。

10

これは古い質問ですが、この質問にはmap-reduceイデオロギーを使用した回答が必要だと思います。だからここ :

from functools import reduce 

def ilen(iterable): 
    return reduce(lambda sum, element: sum + 1, iterable, 0) 

ilen(filter(lambda x: x > 3, n)) 

nは、コンピュータメモリ内に収まらない場合、これは特に良いです。

関連する問題