例如,在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
为了澄清,我明白整个文件都要读!我只是不想一下子记住
除了迭代iterable并计算迭代次数之外,不。这就是为什么它是iterable而不是list。这甚至不是python特有的问题。看看经典的链表数据结构。查找长度是一个O(n)操作,涉及迭代整个列表以查找元素的数量。
如上所述,您可以将您的功能减少到:
当然,如果您定义自己的iterable对象,那么您始终可以自己实现
__len__
,并在某个地方保留一个元素计数。我用这个重新定义已经有一段时间了:
如果你需要数一数你能做到的行数,我不知道还有什么更好的方法:
相关问题 更多 >
编程相关推荐