我的函数创建发电机的链条:如何反转itertools.chain对象?
def bar(num):
import itertools
some_sequence = (x*1.5 for x in range(num))
some_other_sequence = (x*2.6 for x in range(num))
chained = itertools.chain(some_sequence, some_other_sequence)
return chained
我的函数有时会需要在相反的顺序返回chained
。从概念上讲,下面是我想什么能够做到:
if num < 0:
return reversed(chained)
return chained
不幸的是:
>>> reversed(chained)
TypeError: argument to reversed() must be a sequence
我有哪些选择?
这在某些实时的图形渲染代码,所以我不想弄得太复杂/慢。
编辑: 当我第一次提出这个问题时,我没有想过发电机的可逆性。正如许多人指出的那样,发电机不能倒转。
我实际上做希望调换链的扁平内容;不仅仅是发电机的顺序。
根据回复,我可以使用任何单个调用来反转itertools.chain,所以我认为这里唯一的解决方案是使用一个列表,至少对于相反的情况,或者对于两者都可以。
哼的版本,我还以为'itertools.islice`带有负一步会工作,但事实证明,只有正值是有效的是对Arg的` islice`。有趣的问题。 – 2011-02-15 20:13:15
这不仅仅是'链接',它是你的生成器: >>>颠倒((x对于范围(5)中的x))` `TypeError:参数到颠倒()必须是一个序列` – 2011-02-15 20:13:34
@jleedev好点;即使有办法翻转itertools.chain,也不能逆转生成器。我以前没有意识到,但现在明白了。但是,反转也不适用于仅由列表组成的itertools.chain。 – 2011-02-15 22:03:13