有没有内置的方法来获取python中的iterable的长度? [英] Is there any built-in way to get the length of an iterable in python?

查看:925
本文介绍了有没有内置的方法来获取python中的iterable的长度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆