list和islice对象都是可迭代的,但为什么会产生这种差异。
r = [1, 2, 3, 4]
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[1, 2, 3, 4]
r = islice(count(), 1, 5)
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[]
答案 0 :(得分:14)
这里的问题是tee()
需要使用原始迭代器中的值,如果从原始迭代器开始使用它们,它将无法正常运行。在列表示例中,迭代再次开始。在生成器示例中,它已耗尽,不再生成任何值。
这是有据可查的:
一旦tee()进行了拆分,原始的iteable不应该在其他任何地方使用;否则,迭代可以在不通知tee对象的情况下进行。
编辑以说明列表与生成器之间差异的点:
>>> from itertools import islice, count
>>> a = list(range(5))
>>> b = islice(count(), 0, 5)
>>> a
[0, 1, 2, 3, 4]
>>> b
<itertools.islice object at 0x7fabc95d0fc8>
>>> for item in a:
... print(item)
...
0
1
2
3
4
>>> for item in a:
... print(item)
...
0
1
2
3
4
>>> for item in b:
... print(item)
...
0
1
2
3
4
>>> for item in b:
... print(item)
...
>>>
答案 1 :(得分:0)
在列表推导中,您希望将r
替换为i1
。