首页 > 解决方案 > 等效于迭代器的 cdr/rest

问题描述

给定一个迭代器(比如一个无限序列iter = itertools.count()),我可以得到第一个next(iter)除了第一个之外,你得到所有东西的反面是什么?

我意识到我能做到

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

但是没有内置的东西吗?

标签: python

解决方案


你可以先分开,然后休息

first, *rest = iter

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

您还可以使用itertools.islice基于 start、stop 和 step 来获取可迭代的子集。

>>> 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]

Anislice仍然是惰性的,如果迭代器是无限的或很长,这可能会更可取。

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

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

推荐阅读