web-dev-qa-db-ja.com

ジェネレーター/イテレーター内のアイテムの数をカウントする最短の方法は何ですか?

要素自体を気にせずに反復可能なアイテムの数が必要な場合、それを取得するPythonの方法は何ですか?今、私は定義します

def ilen(it):
    return sum(itertools.imap(lambda _: 1, it))    # or just map in Python 3

しかし、lambdaが有害と見なされることに近いこと、およびlambda _: 1確かにきれいではありません。

(この使用例は、正規表現に一致するテキストファイルの行数、つまりgrep -c。)

59
Fred Foo

通常の方法は

sum(1 for i in it)
133
Sven Marnach

簡単な方法は次のとおりです。

def ilen(it):
    return len(list(it))

要素のlot(数万以上)を生成する場合、それらをリストに入れるとパフォーマンスの問題になる可能性があることに注意してください。ただし、これは、ほとんどの場合パフォーマンスが問題にならないという考え方の単純な表現です。

7
Greg Hewgill

more_itertools は、 ilen ツールを実装するサードパーティライブラリです。 pip install more_itertools

import more_itertools as mit


mit.ilen(x for x in range(10))
# 10
4
pylang

これには 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
1
Erwin Mayer

これらは、どちらか一方の私の選択になります。

print(len([*gen]))
print(len(list(gen)))
1
prosti