1. ホーム
  2. python

Pythonで反復記号の長さを取得するための組み込みの方法はありますか?

2023-08-24 15:06:27

質問

例えば、Pythonのファイルは反復可能で、ファイル内の行を反復します。私は行の数をカウントしたい。

一つの手っ取り早い方法として

lines = len(list(open(fname)))

しかし、これではファイル全体を(一度に)メモリにロードしてしまいます。これはむしろイテレータの目的(メモリ内の現在の行を保持する必要があるだけ)を打ち破ります。

これは動作しません。

lines = len(line for line in open(fname))

のように、ジェネレータには長さがありません。

カウント関数を定義しない限り、これを行う方法はないのでしょうか?

def count(i):
    c = 0
    for el in i: c += 1
    return c

はっきり言って、ファイル全体を読み込まなければならないことは理解しています! 私はただ、一度にメモリに入れたくないだけです。

どのように解決するのですか?

イテラブルを反復処理し、その回数を数えるだけでは、ダメです。それはリストではなくイテラブルであることです。これは本当にPython固有の問題でもありません。古典的なリンクリストのデータ構造を見てください。長さを求めるのはO(n)演算で、要素数を求めるためにリスト全体を反復処理する必要があります。

mcruteが上で述べたように、あなたはおそらくあなたの関数を減らすことができます。

def count_iterable(i):
    return sum(1 for e in i)

もちろん、独自の反復処理可能なオブジェクトを定義する場合は、常に __len__ を自分で実装し、どこかで要素のカウントを保持することができます。