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