2008-12-20 15 views
6

Estoy usando Python a infinitamente itere sobre una lista, repitiendo cada elemento en la lista varias veces. Por ejemplo, dada la lista:Cómo iterar sobre una lista repitiendo cada elemento en Python

l = [1, 2, 3, 4] 

quisiera salida de 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 repetir hasta el infinito. También he usado repetir el elemento dos veces como el ejemplo más corto - Realmente me gustaría repetir cada elemento n veces.

actualización

¿Su solución me llevan 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!

+0

Cuándo quiere que se detenga? –

Respuesta

13

¿Qué tal esto: editar

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)] 

: incorporada parámetro de recuento de bishanty's de repetición y Adam Rosenfield's list comprehension.

+0

>>> importar itertools >>> def ncycle (iterable, n): ... para el artículo en itertools.cycle (iterable): ... para i en el rango (n): ... yield item –

+0

Esta es una respuesta tan dulce. Ojalá pudiera hacer +10. – PEZ

1

solución debe ser algo 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: añadido 'while (true)' para iterar indefinidamente.

6

Usted podría hacerlo con un generador con bastante facilidad:

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] 
+0

Una vez más, no estoy 100% seguro de haber entendido la pregunta, pero ¿no son un poco exagerados los generadores para un problema simple como devolver un artículo dos veces (o n veces)? –

+0

Son 5 líneas. ¿Cómo puede ser eso exagerado? Y si la alternativa es construir una lista, eso es imposible, porque es una longitud infinita. – recursive

+0

¿Por qué crear una función en primer lugar? Puede alcanzar los mismos resultados con un simple bucle anidado, sin necesidad de un generador, Leyendo el bucle, incluso un novato comprende inmediatamente el significado del código, mientras que con los generadores debe confiar en el nombre de la función. –

0
[ "%d, %d" % (i, i) for i in [1, 2, 3, 4] * 4] 

Los últimos 4 que hay son la cantidad de ciclos.

1
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)))) 
0
itertools.chain.from_iterable(itertools.repeat(item, repeat) for item in itertools.cycle(l)) 
0

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 
Cuestiones relacionadas