有没有内置的方法来获取python中的iterable的长度? [英] Is there any built-in way to get the length of an iterable in python?
问题描述
例如,Python中的文件是可迭代的 - 它们遍历文件中的行。我想计算行数。
For example, files, in Python, are iterable - they iterate over the lines in the file. I want to count the number of lines.
一种快速方法是:
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 =).
推荐答案
没有迭代遍历迭代并计算数字迭代,没有。这就是使它成为可迭代而不是列表的原因。这甚至不是特定于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中的iterable的长度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!