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