por - Cómo iterar sobre una lista repitiendo cada elemento en Python
llenar una lista en python (7)
La solución debería ser algo así como
iterable = [1, 2, 3, 4]
n = 2
while (True):
for elem in iterable:
for dummy in range(n):
print elem # or call function, or whatever
Editar: agregó ''While (True)'' para iterar indefinidamente.
Estoy usando Python para iterar infinitamente sobre una lista, repitiendo cada elemento en la lista varias veces. Por ejemplo, dada la lista:
l = [1, 2, 3, 4]
Me gustaría dar salida a cada elemento dos veces y luego repetir el ciclo:
1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2 ...
Tengo una idea de por dónde empezar:
def cycle(iterable):
if not hasattr(cycle, ''state''):
cycle.state = itertools.cycle(iterable)
return cycle.next()
>>> l = [1, 2, 3, 4]
>>> cycle(l)
1
>>> cycle(l)
2
>>> cycle(l)
3
>>> cycle(l)
4
>>> cycle(l)
1
Pero, ¿cómo iba a repetir cada elemento?
Editar
Para aclarar esto, debe iterar infinitamente. También he usado repetir el elemento dos veces como el ejemplo más breve: me gustaría repetir cada elemento n veces .
Actualizar
¿Su solución me llevará a lo que estaba buscando?
>>> import itertools
>>> def ncycle(iterable, n):
... for item in itertools.cycle(iterable):
... for i in range(n):
... yield item
>>> a = ncycle([1,2], 2)
>>> a.next()
1
>>> a.next()
1
>>> a.next()
2
>>> a.next()
2
>>> a.next()
1
>>> a.next()
1
>>> a.next()
2
>>> a.next()
2
Gracias por las respuestas rápidas!
Podrías hacerlo con un generador bastante fácilmente:
def cycle(iterable):
while True:
for item in iterable:
yield item
yield item
x=[1,2,3]
c=cycle(x)
print [c.next() for i in range(10)] // prints out [1,1,2,2,3,3,1,1,2,2]
[ "%d, %d" % (i, i) for i in [1, 2, 3, 4] * 4]
Los últimos 4 hay la cantidad de ciclos.
import itertools as it
def ncycle(iterable, n=1):
if n == 1:
return it.cycle(iterable)
return it.cycle(it.chain(*it.izip(*([iterable]*n))))
itertools.chain.from_iterable(itertools.repeat(item, repeat) for item in itertools.cycle(l))
Qué tal esto:
import itertools
def bicycle(iterable, repeat=1):
for item in itertools.cycle(iterable):
for _ in xrange(repeat):
yield item
c = bicycle([1,2,3,4], 2)
print [c.next() for _ in xrange(10)]
EDITAR: incorpora el parámetro de recuento repetido de bishanty y la lista de comprensión de Adam Rosenfield .
Lo hago de esta manera:
from itertools import cycle, repeat, chain
flatten = chain.from_iterable # better name
def ncycle(xs, n):
return flatten(repeat(x, n) for x in cycle(xs))
# example
for n,x in enumerate(ncycle(''abcd'', 2)):
print(x, end=" ")
if n > 9:
print("")
break
# output: a a b b c c d d a a b