Python:是否有可能事先知道迭代器对象中有多少迭代?



到目前为止,如果我想知道迭代器中有多少次迭代(在我的例子中是一个文件中有多少个蛋白质序列),我做了:

count = 0
for stuff in iterator:
    count += 1
print count

然而,我想把迭代器分成两半,所以我需要知道迭代的总次数。有没有一种方法可以在不遍历迭代器的情况下知道迭代的次数?

如果不使用迭代器,则无法知道迭代器将产生多少值。请注意,迭代器也可以是无限的,因此在这种情况下,甚至没有定义总数。

如果你能确保迭代器是有限的,一种方法是将其转换为列表(使用list(iterator)),然后使用通常的列表函数(len, slicing)将其分成两半。当然,这样所有的项目将同时在内存中,这对你来说可能是也可能是不可接受的。

或者,您可以尝试使用一个自定义迭代器类来跟踪将要生成的项目的总数。这是否可行取决于所述迭代器是如何获得的。

由于迭代器协议只定义了两个方法:

iterator.__iter__()
iterator.next()

答案是否定的,一般情况下,如果不遍历有限迭代器,就无法知道它们的个数

您可以使用list()将您的迭代器转换为列表,并使用len()获取列表的大小,例如:

len(list(iterator))

我认为Niek de Klein提出的问题与"停止问题"(http://en.wikipedia.org/wiki/Halting_problem)有关。因此,没有任何方法可以确定迭代器的长度,这是有很强的理论依据的!

我的意思是我可以写一个Python迭代器,如果这样的成员函数存在,那么我就解决了暂停问题。

当然,特定的容器或您自己的自定义类(如Paolo所建议的)可以有这样的方法。但是不可能有一个在有限时间内运行的通用程序!

已经提供了四个答案,一个被接受,但是你的问题是正确的吗?如果文件中有蛋白质序列,迭代器是应用程序的最佳文件接口吗?如果您只需要序列数量的初始近似值,那么将文件长度除以序列的平均长度(如果已知先验)将非常便宜。或者,如果迭代器由数据库支持,则可以直接查询记录的数量。

最新更新