到目前为止,如果我想知道迭代器中有多少次迭代(在我的情况下,文件中有多少蛋白质序列)我做了:
count = 0
for stuff in iterator:
count += 1
print count
但是,我想将迭代器分成两半,所以我需要知道迭代的总量。有没有办法知道迭代的数量,而不通过迭代器循环?
答案 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)
已经提供了四个答案,一个已被接受,但您的问题是正确的吗?如果文件中有蛋白质序列,那么迭代器是应用程序的最佳文件接口吗?如果您只需要序列数的初始近似值,那么将文件的长度超过序列的平均长度(如果已知的先验)则非常便宜。或者,如果迭代器由数据库支持,则可以直接查询记录数。