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

时间:2016-02-03 15:46:31

标签: python itertools

我遇到了一个问题,我不明白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]

2 个答案:

答案 0 :(得分:3)

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

next_symbol = zcycle.next()

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

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

next_symbol = z[0]

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

答案 1 :(得分:0)

如果你有一个actul迭代器,可以用tee和group做它:

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]))
相关问题