Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问python中的下一个元素_Python_Itertools - Fatal编程技术网

访问python中的下一个元素

访问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 我的代码假设从一开始就给我列表中的元

我面临的问题是我不理解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
,所有迭代将停止。

如果您有一个实际的迭代器,则可以使用一个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
也可以解决问题。简单得多。