gpt4 book ai didi

python itertools : Using cycle with islice

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:29 26 4
gpt4 key购买 nike

问题:

我有下面的代码。我想知道为什么我是否在下面的代码中包含带有注释的行并不重要。

#!/usr/bin/env python

from itertools import *
import time
cc = cycle([ iter([1,2,3]), iter([4]) , iter([5,6]) ] )
p = 3
while p:
try:
for k in cc:
print k.next()
except StopIteration:
p = p - 1
cc = cycle(islice(cc, p)) # this does not matter

输出:

1
4
5
2
6
3

还可以查看 roundrobin 食谱

http://docs.python.org/2.7/library/itertools.html

此代码显示 islice 正在影响 cc

#!/usr/bin/env python

from itertools import *
import time
cc = cycle([ iter([1,2,3]), iter([4]) , iter([5,6]) ] )
p = 3
while p:
try:
for k in cc:
print k,k.next()
except StopIteration:
print "stop iter"
p = p - 1
cc = cycle(islice(cc, p))

输出

<listiterator object at 0x7f32bc50cfd0> 1
<listiterator object at 0x7f32bc518050> 4
<listiterator object at 0x7f32bc518090> 5
<listiterator object at 0x7f32bc50cfd0> 2
<listiterator object at 0x7f32bc518050> stop iter
<listiterator object at 0x7f32bc518090> 6
<listiterator object at 0x7f32bc50cfd0> 3
<listiterator object at 0x7f32bc518090> stop iter
<listiterator object at 0x7f32bc50cfd0> stop iter

最佳答案

嗯……看起来它正在做这里预期的事情。

所以,通常情况下,循环是这样工作的:

cycle([1,2,3,4,5]) -> [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]

它将存储关闭值直到它获得一个 StopIterator,然后它将开始从其保存的列表中返回值。在这种情况下,这将是 [iter(a), iter(b), iter(c)] (其中 iter(x) 是一个列表迭代器对象本身,跨越内部的任何内容)。所以 chain 实际上返回的是这样的东西:

[iter(a), iter(b), iter(c), iter(a), iter(b), iter(c), iter(a), iter(b), iter(c), ...]

运行时的样子:

[1, 4, 5, 2, StopIterator]

但这是 k.next() 的值,而不是 k。 cc 本身不返回 StopIterator,它返回的对象是。

现在,您调用 islice(cc,2)。这应该返回序列 [iter(c), iter(a)],因为它们是序列中的下两个项目。同样,您希望 cc 循环它们,但现在您应该得到

[iter(c), iter(a), iter(c), iter(a), iter(c), iter(a), ...]

您还不会注意到有什么不同,但那是因为您的切片比原始切片的长度短。换句话说,原来的会消失 [iter(c), iter(a), iter(b), iter(c), iter(a), ...]

但你必须比两个项目走得更远才能看到这种差异,并且...

你开始拉东西然后你得到

[6, 3, StopIterator]

只有两个项目,因此它们与没有 islice 时得到的两个项目相同。

现在,当您执行 islice(cc, 2) 时,您会得到接下来的两项,它们是 [iter(a), iter(c)]。这两个都用完了,所以你得到

[StopIterator]

以及您的确切顺序。

我不知道你在期待什么,但这完全符合我的预期。

关于 python itertools : Using cycle with islice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com