2009-09-18 21 views

cevap

39

seq ise, o zaman, bir listesi:

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

SO çok tembel yapıyor. –

+2

@Sridhar, bunu tembel olarak düşünmeyin, * zaman açısından verimli * düşünün. Bir * for * döngüsü ile bunu yapmak için bir algoritma üzerinde çalışarak yarım saat çalıştım (sadece x değil * x * sütunlar için). Ve çalışmamı sağlasa da, sadece görünmüyordu * pythonic * - Daha kolay bir yol olduğunu düşündüm. Tabii ki, listelerin önemsiz kılan * adım * değişkenleri olduğunu (bu Cevapta gösterildiği gibi) hatırlamadım. –

+0

Bu güzel, bu sözdizimi hakkında bile bilmiyordum. Teşekkürler! – sleepycal

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

Yalnızca diğer çözümlerin herhangi bir yinelenebilir için çalıştığı listelerde çalışır. –

+3

true, ancak başlık bir liste belirtiyordu – cobbal

9
: seq böyle olasılıkla bir jeneratör olarak, tamamen jenerik iterable olan

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

ise

Bir yineleyici alır ve iki yineleyici döndürür:

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 

Listeleri tercih ederseniz, return list(even),list(odd).

İlgili konular