Mi función crea una cadena de generadores:¿Cómo invierto un objeto 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
Mi función a veces tiene que volver chained
en orden inverso. Conceptualmente, la siguiente es lo que me gustaría ser capaz de hacer:
if num < 0:
return reversed(chained)
return chained
Desafortunadamente:
>>> reversed(chained)
TypeError: argument to reversed() must be a sequence
¿Cuáles son mis opciones?
Esto está en algún código de representación gráfica en tiempo real, así que no quiero que sea demasiado complicado/lento.
EDIT: Cuando planteé por primera vez esta pregunta, no había pensado en la reversibilidad de los generadores. Como muchos han señalado, los generadores no se pueden revertir.
De hecho, quiero invertir el contenido aplanado de la cadena; no solo el orden de los generadores
Según las respuestas, no hay una sola llamada que pueda usar para invertir una cadena de itertools, por lo que creo que la única solución es usar una lista, al menos para el caso inverso y quizás para ambas.
Hm, yo habría pensado 'itertools.islice' con un paso negativo habría funcionado, pero resulta que sólo los valores positivos son válidos para esa arg a' islice'. Interesante pregunta. –
No es solo 'encadenado', son sus generadores: ' >>> invertido ((x para x en el rango (5))) ' ' TypeError: argumento para invertir() debe ser una secuencia' –
@jleedev Buen punto ; los generadores no se pueden revertir incluso si hay una forma de invertir una cadena de itertools. No me había dado cuenta de eso antes, pero entiéndelo ahora. Sin embargo, al revés tampoco funciona en un itertools.chain que se compone exclusivamente de listas. –