在python中有没有内置的方法来获取iterable的长度?

2024-04-29 11:12:22 发布

您现在位置: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

为了澄清,我明白整个文件都要读!我只是不想一下子记住


Tags: 文件方法内存inforlen定义line
3条回答

除了迭代iterable并计算迭代次数之外,不。这就是为什么它是iterable而不是list。这甚至不是python特有的问题。看看经典的链表数据结构。查找长度是一个O(n)操作,涉及迭代整个列表以查找元素的数量。

如上所述,您可以将您的功能减少到:

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

当然,如果您定义自己的iterable对象,那么您始终可以自己实现__len__,并在某个地方保留一个元素计数。

我用这个重新定义已经有一段时间了:

def len(thingy):
    try:
        return thingy.__len__()
    except AttributeError:
        return sum(1 for item in iter(thingy))

如果你需要数一数你能做到的行数,我不知道还有什么更好的方法:

line_count = sum(1 for line in open("yourfile.txt"))

相关问题 更多 >