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

时间:2011-12-27 09:57:53

标签: python iterator

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

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

但是,我想将迭代器分成两半,所以我需要知道迭代的总量。有没有办法知道迭代的数量,而不通过迭代器循环?

5 个答案:

答案 0 :(得分:10)

没有办法知道迭代器生成多少值而不消耗它直到结束。请注意,迭代器也可以是无限的,因此在这种情况下甚至不会定义总计数。

如果你可以确保迭代器是有限的,那么你要问的一种方法是将它转换为list(使用list(iterator)),然后使用通常的列表函数(len,切片)将它分成两半。当然,通过这种方式,所有项目将同时存储在内存中,在您的情况下可能接受也可能不接受。

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

答案 1 :(得分:5)

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

iterator.__iter__()

iterator.next()

答案是否定的,一般情况下,如果不迭代它们,你就无法知道有限迭代器中的项目数。

答案 2 :(得分:1)

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

len(list(iterator))

答案 3 :(得分:1)

我认为Niek de Klein提出的问题与“停止问题”有关(http://en.wikipedia.org/wiki/Halting_problem)。 因此,由于强大的理论原因,没有任何方法可以确定迭代器的持续时间!

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

当然,特定容器或您自己的自定义类(由Paolo建议)可以使用这种方法。但是在有限的时间内不可能有一般的运行!

答案 4 :(得分:0)

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