访问python中的下一个元素
我面临的问题是我不理解itertools.takewhile()代码是如何工作的访问python中的下一个元素,python,itertools,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 我的代码假设从一开始就给我列表中的元
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
,所有迭代将停止。如果您有一个实际的迭代器,则可以使用一个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]))
如果您的输入是
z=[3,3,9,9,3,4,1]
,您希望输出是什么<代码>[3,3,9]<代码>[3,3,9,9]<代码>[3,3,9,9,3]?你为什么期望[3,3]而不是[3,3,9]?@DainDwarf:当然是后者。谢谢)还有一个问题——据我所知,如果列表由相等的元素组成,将有一个无限循环。在这种情况下,我如何避免它并返回相同的列表?示例[3,3,3,3,3,3]或[3,3,9,3,3,3]返回[3,3,3,3,3]/[3,3,3,9,3,3]@Taras\G:您可以使用itertools.islice()
将结果限制为与输入相同的长度。@Taras\G在这种情况下,不使用cycle
如何?@StefanPochmann:很好,完全删除cycle
也可以解决问题。简单得多。