小编典典

有没有内置的方法来获取python中可迭代的长度?

python

例如,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

为了澄清,我知道必须读取整个文件!我只是不想一次全部存储在内存中


阅读 209

收藏
2021-01-20

共1个答案

小编典典

缺少迭代遍历和计算迭代次数的方法。这就是使其成为可迭代的而不是列表的原因。这实际上甚至不是特定于python的问题。看一下经典的链表数据结构。查找长度是一个O(n)操作,涉及对整个列表进行迭代以查找元素的数量。

正如上面提到的,您可以将函数缩减为:

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

当然,如果要定义自己的可迭代对象,则始终可以实现__len__自己并将元素计数保持在某个位置。

2021-01-20