una por misma metodos llenar listas lista eliminar elementos comprensión comparar cambiar arreglos agregar python iterator

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