要素自体を気にせずに反復可能なアイテムの数が必要な場合、それを取得するPythonの方法は何ですか?今、私は定義します
def ilen(it):
return sum(itertools.imap(lambda _: 1, it)) # or just map in Python 3
しかし、lambda
が有害と見なされることに近いこと、およびlambda _: 1
確かにきれいではありません。
(この使用例は、正規表現に一致するテキストファイルの行数、つまりgrep -c
。)
通常の方法は
sum(1 for i in it)
簡単な方法は次のとおりです。
def ilen(it):
return len(list(it))
要素のlot(数万以上)を生成する場合、それらをリストに入れるとパフォーマンスの問題になる可能性があることに注意してください。ただし、これは、ほとんどの場合パフォーマンスが問題にならないという考え方の単純な表現です。
more_itertools
は、 ilen
ツールを実装するサードパーティライブラリです。 pip install more_itertools
import more_itertools as mit
mit.ilen(x for x in range(10))
# 10
これには cardinality パッケージが好きです。これは非常に軽量で、イテレート可能オブジェクトに応じて利用可能な最速の実装を使用しようとします。
使用法:
>>> import cardinality
>>> cardinality.count([1, 2, 3])
3
>>> cardinality.count(i for i in range(500))
500
>>> def gen():
... yield 'hello'
... yield 'world'
>>> cardinality.count(gen())
2
これらは、どちらか一方の私の選択になります。
print(len([*gen]))
print(len(list(gen)))