你可以讓它更簡單/優雅嗎?Python程序將一個列表分成兩個列表,交替顯示元素
def zigzag(seq):
"""Return two sequences with alternating elements from `seq`"""
x, y = [], []
p, q = x, y
for e in seq:
p.append(e)
p, q = q, p
return x, y
你可以讓它更簡單/優雅嗎?Python程序將一個列表分成兩個列表,交替顯示元素
def zigzag(seq):
"""Return two sequences with alternating elements from `seq`"""
x, y = [], []
p, q = x, y
for e in seq:
p.append(e)
p, q = q, p
return x, y
如果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
def zigzag(seq):
return seq[::2], seq[1::2]
只適用於列表,而其他解決方案適用於任何迭代。 – 2009-09-18 05:59:22
是真的,但標題確實指定了一個清單 – cobbal 2009-09-18 06:37:47
這需要一個迭代器並返回兩個迭代器:
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)
。
SO太懶惰了。 – 2009-09-18 17:58:20
@Sridhar,不要認爲它太懶,認爲它是*省時*。我花了半個小時工作一個算法,用* for *循環做這個(對於* x *列,而不僅僅是兩個)。雖然我得到了它的工作,但它似乎沒有* pythonic * - 我懷疑有一個更簡單的方法。果然,我不記得列表中有* step *變量(如本答案中所示),這使得它變得微不足道。 – 2011-05-08 15:37:09
這很漂亮,甚至不知道那種語法。謝謝! – sleepycal 2014-03-27 13:44:48