我的函數創建發電機的鏈條:如何反轉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