来自itertools库的tee函数

时间:2012-06-12 14:43:43

标签: python itertools

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]
#[]

2 个答案:

答案 0 :(得分:14)

这里的问题是tee()需要使用原始迭代器中的值,如果从原始迭代器开始使用它们,它将无法正常运行。在列表示例中,迭代再次开始。在生成器示例中,它已耗尽,不再生成任何值。

这是有据可查的:

  

一旦tee()进行了拆分,原始的iteable不应该在其他任何地方使用;否则,迭代可以在不通知tee对象的情况下进行。

Source

编辑以说明列表与生成器之间差异的点:

>>> 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