2009-09-18 9 views

Répondre

39

Si seq, comme vous le dites, est une liste, puis:

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

Si seq est un itérables totalement générique, comme peut-être un générateur:

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

SO fait tellement paresseux. –

+2

@Sridhar, ne pense pas que c'est paresseux, pensez-y que * temps efficace *. J'ai passé une demi-heure à travailler sur un algorithme pour le faire avec une boucle * for * (pour les colonnes * x *, pas seulement deux). Et même si je l'ai fait fonctionner, ça ne me semblait pas * pythonique * - je me doutais qu'il y avait un moyen plus facile. Effectivement, je ne me souviens pas que les listes ont des variables * step * (comme indiqué dans cette réponse), ce qui le rend trivial. –

+0

C'est magnifique, je ne connaissais même pas cette syntaxe. Merci! – sleepycal

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

Ne fonctionne que pour les listes alors que l'autre solution fonctionne pour tout itérable. –

+3

vrai, mais le titre a spécifié une liste – cobbal

9

Cela prend un itérateur et renvoie deux itérateurs:

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 vous préférez les listes, vous pouvez return list(even),list(odd).

Questions connexes