2009-09-18 51 views

Respuesta

39

Si seq, como usted dice, es una lista, a continuación:

def zigzag(seq): 
    return seq[::2], seq[1::2] 

Si seq es un iterable totalmente genérico, como posiblemente un generador:

def zigzag(seq): 
    results = [], [] 
    for i, e in enumerate(seq): 
    results[i%2].append(e) 
    return results 
+1

SO está haciendo tan vago. –

+2

@Sridhar, no pienses que es flojo, piensa que es * eficiente en el tiempo *. Pasé media hora trabajando en un algoritmo para hacer esto con un bucle * for * (para * x * columnas, no solo dos). Y aunque lo conseguí funcionando, simplemente no parecía * pitónico * - Sospeché que había una manera más fácil. Efectivamente, no recordaba que las listas tengan * variables * de paso * (como se muestra en esta Respuesta), lo que lo hace trivial. –

+0

Esto es hermoso, ni siquiera sabía acerca de esa sintaxis. ¡Gracias! – sleepycal

8
def zigzag(seq): 
    return seq[::2], seq[1::2] 
+0

Solo funciona para las listas, mientras que la otra solución funciona para cualquier iterable. –

+3

cierto, pero el título especificó una lista – cobbal

9

Esto toma un iterador y devuelve dos iteradores:

import itertools 
def zigzag(seq): 
    t1,t2 = itertools.tee(seq) 
    even = itertools.islice(t1,0,None,2) 
    odd = itertools.islice(t2,1,None,2) 
    return even,odd 

Si prefiere listas, entonces puede return list(even),list(odd).

Cuestiones relacionadas