itertools.takewhile() 访问 python 中的下一个元素

itertools.takewhile() accessing next element in python

我遇到了一个问题,我不明白 itertools.takewhile() 代码是如何工作的。

import itertools

z = [3,3,9,4,1]

zcycle = itertools.cycle(z)
next_symbol = zcycle.next()
y = list(itertools.takewhile(lambda symbol: symbol == next_symbol or symbol == 9, zcycle))
print y

如果列表中的元素相同或元素等于 9,我的代码应该从头开始给我。因此,一旦我们遇到与前一个元素不同的元素,我们就应该停止。

我预计结果会是 [3, 3] 但我得到的却是 [3, 9]。 为什么我们错过了列表的第一个元素? 是否有可能以某种方式使输出等于 [3, 3, 9]?

您从此处的序列中删除了第一个 3

next_symbol = zcycle.next()

zcycle 推进到下一个元素,因此它会再产生一个 3,而不是两个。

不要在 zcycle 对象上调用 next();也许使用 z[0] 代替:

next_symbol = z[0]

现在 zcycle 将产生 3,然后是另一个 3,然后是 9,之后 takewhile() 条件将是 False所有迭代都将停止。

如果你有一个 actul 迭代器,可以用 tee an groupby 来做到这一点:

from itertools import tee, groupby, cycle

z = [3, 3, 9, 4, 1]
zcycle = cycle(z)
a, b = tee(zcycle)
next_symbol = next(b)
grps = groupby(a, key=lambda symbol: symbol in {9, next(b), next_symbol})
g = next(grps)
if g[0]:
    print(list(g[1]))