迭代器的等效cdr / rest

时间:2018-06-12 04:08:25

标签: python

给定一个迭代器(就像一个iter = itertools.count()的无限序列),我可以得到next(iter)的第一个迭代器。你得到所有是第一个?

的反面是什么?

我意识到我能做到

def rest(iter):
  next(iter)
  return (x for x in iter)

但是内置了什么?

1 个答案:

答案 0 :(得分:3)

你可以先分开,然后用

分开
first, *rest = iter

但这实现了整个迭代器 - rest现在包含一个列表。

您还可以使用itertools.islice根据开始,停止和步骤获取可迭代的子集。

>>> from itertools import islice
>>> [*range(9)]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> [*islice(range(9), 1, None)]
[1, 2, 3, 4, 5, 6, 7, 8]

islice仍然是惰性的,如果迭代器是无限的或非常长的话,这可能更好。

理解迭代器包含状态并且是可变的。所以一旦你有了迭代器,如果你选择了下一个迭代器,那么它就不再是其余部分。

>>> spam = iter(range(9))
>>> next(spam)
0
>>> [*spam]
[1, 2, 3, 4, 5, 6, 7, 8]