如何将一个无限范围的迭代器压缩成一个zip文件?

4

我希望在迭代器遍历时能够跟踪索引。 在Haskell中,我可以使用无限整数列表[1..]将迭代器与其配对。 但是,我不知道Python中是否有类似的功能。 最简单的构建此类迭代器的方法是什么?

for (case,i) in zip(data, magic_infinite_list):
    print('Case #{}: {}'.format(i,case))

(我知道我可以创建一个变量 i 并手动递增它,但这不是重点 - 我想知道是否可以使用迭代器来实现这一点)
我知道我可以手动创建一个变量 `i` 并递增它,但这不是重点——我想知道是否可以使用迭代器来实现这个功能。

2
在这种情况下,您应该使用enumerate,但如果您想更改步骤,则还可以使用itertools.count 进行压缩。如果您来自Haskell,您可能希望熟悉itertools,以满足您所有的惰性迭代器需求! - juanpa.arrivillaga
2个回答

5

你应该使用 enumerate。注意这里的 i 是以0为基础的:

for (i, case) in enumerate(data):
    print('Case #{}: {}'.format(i + 1, case))

哇,我不知道那个存在!非常感谢! - Elliot Gorokhovsky
你知道为什么他们选择了 i,case 而不是 case,i 吗?对我来说似乎有些违反直觉。 - Elliot Gorokhovsky
1
我猜通常人们会在实际对象之前放置对象的ID。实际上,我认为这更直观。 - Chuancong Gao

3

enumerate() 已经提供了,这是大多数人会使用的。但是如果你真的想从1开始,并获取整数第二个,itertools.count() 会生成一个懒惰的无限整数序列:

import itertools
for case, i in zip(data, itertools.count(1)):
    ...

我认为我会接受这个答案,因为它给出了实用的解决方案(enumerate),同时也回答了我的实际问题。这就是在Haskell中我不会但在Python中知道的少一件事情! - Elliot Gorokhovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接