2009-09-18 110 views

回答

39

如果seq,就像你說的,是一個列表,則:

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

如果seq是完全通用的迭代,比如可能是發電機:

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

SO太懶惰了。 – 2009-09-18 17:58:20

+2

@Sridhar,不要認爲它太懶,認爲它是*省時*。我花了半個小時工作一個算法,用* for *循環做這個(對於* x *列,而不僅僅是兩個)。雖然我得到了它的工作,但它似乎沒有* pythonic * - 我懷疑有一個更簡單的方法。果然,我不記得列表中有* step *變量(如本答案中所示),這使得它變得微不足道。 – 2011-05-08 15:37:09

+0

這很漂亮,甚至不知道那種語法。謝謝! – sleepycal 2014-03-27 13:44:48

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

只適用於列表,而其他解決方案適用於任何迭代。 – 2009-09-18 05:59:22

+3

是真的,但標題確實指定了一個清單 – cobbal 2009-09-18 06:37:47

9

這需要一個迭代器並返回兩個迭代器:

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 

如果你喜歡列表,那麼你可以return list(even),list(odd)

相關問題