問題描述
例如,Python 中的文件是可迭代的——它們迭代文件中的行.我想計算行數.
For example, files, in Python, are iterable - they iterate over the lines in the file. I want to count the number of lines.
一種快速的方法是這樣做:
One quick way is to do this:
lines = len(list(open(fname)))
但是,這會將整個文件加載到內存中(一次).這反而違背了迭代器的目的(只需要將當前行保留在內存中).
However, this loads the whole file into memory (at once). This rather defeats the purpose of an iterator (which only needs to keep the current line in memory).
這不起作用:
lines = len(line for line in open(fname))
因為生成器沒有長度.
除了定義一個計數函數之外,還有什么方法可以做到這一點嗎?
Is there any way to do this short of defining a count function?
def count(i):
c = 0
for el in i: c += 1
return c
為了澄清,我知道必須閱讀整個文件!我只是不想一下子把它放在內存中
To clarify, I understand that the whole file will have to be read! I just don't want it in memory all at once
推薦答案
沒有遍歷iterable并計算迭代次數,沒有.這就是使它成為可迭代而不是列表的原因.這甚至不是一個特定于 python 的問題.看看經典的鏈表數據結構.查找長度是一個 O(n) 操作,涉及迭代整個列表以查找元素的數量.
Short of iterating through the iterable and counting the number of iterations, no. That's what makes it an iterable and not a list. This isn't really even a python-specific problem. Look at the classic linked-list data structure. Finding the length is an O(n) operation that involves iterating the whole list to find the number of elements.
正如上面提到的 mcrute,您可能可以將您的功能簡化為:
As mcrute mentioned above, you can probably reduce your function to:
def count_iterable(i):
return sum(1 for e in i)
當然,如果您要定義自己的可迭代對象,您始終可以自己實現 __len__
并在某處保留元素計數.
Of course, if you're defining your own iterable object you can always implement __len__
yourself and keep an element count somewhere.
這篇關于是否有任何內置方法可以在 python 中獲取可迭代的長度?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!