How do I reverse an itertools.chain object?

2020-06-12 04:11发布

My function creates a chain of generators:

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

My function sometimes needs to return chained in reversed order. Conceptually, the following is what I would like to be able to do:

if num < 0:
    return reversed(chained)
return chained

Unfortunately:

>>> reversed(chained)
TypeError: argument to reversed() must be a sequence

What are my options?

This is in some realtime graphic rendering code so I don't want to make it too complicated/slow.

EDIT: When I first posed this question I hadn't thought about the reversibility of generators. As many have pointed out, generators can't be reversed.

I do in fact want to reverse the flattened contents of the chain; not just the order of the generators.

Based on the responses, there is no single call I can use to reverse an itertools.chain, so I think the only solution here is to use a list, at least for the reverse case, and perhaps for both.

7条回答
我命由我不由天
2楼-- · 2020-06-12 05:16

Does this work in you real app?

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))
    list_of_chains = [some_sequence, some_other_sequence]
    if num < 0:
        list_of_chains.reverse()
    chained = itertools.chain(*list_of_chains)
    return chained
查看更多
登录 后发表回答