Обратный генератор Python
Я ищу способ изменить объект генератора. Я знаю, как изменить последовательности:
foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))
Но что-то подобное возможно с генератором как входным и обратным генератором, так как выход (len (seq) остается неизменным, поэтому можно использовать значение из исходной последовательности)?
Ответы
Ответ 1
Вы не можете отменить генератор каким-либо общим способом, за исключением того, что вы отбрасываете его в последовательность и создаете из нее итератор. Более поздние термины генератора не обязательно могут быть известны до тех пор, пока не будут рассчитаны более ранние.
Хуже того, вы не можете знать, будет ли ваш генератор когда-либо удалять исключение StopIteration до тех пор, пока вы его не нажмете, поэтому нет способа узнать, что в вашей последовательности будет даже первый член.
Лучшее, что вы могли бы сделать, это написать функцию reverseediterator:
def reversed_iterator(iter):
return reversed(list(iter))
РЕДАКТИРОВАТЬ: Вы также можете, конечно, заменить обратное в этом на итеративную версию на основе imap, чтобы сохранить одно создание списка.
Ответ 2
reversed(list(input_generator))
, вероятно, самый простой способ.
Невозможно получить значения генератора в "обратном порядке", не сводя их все сначала в последовательность, потому что генерация второго элемента вполне может положиться на первый сгенерированный.
Ответ 3
Вам нужно пройтись через генератор, чтобы получить первый элемент, чтобы вы могли составить список. Попробуйте
reversed(list(g))
где g
- генератор.
reversed(tuple(g))
будет работать (я не проверял, есть ли существенная разница в производительности).