你能让它变得更简单/优雅吗?
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
示例输出:
>>> zigzag('123456')
(['1', '3', '5'], ['2', '4', '6'])
答案 0 :(得分:43)
如果你说的话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 :(得分:10)
这需要一个迭代器并返回两个迭代器:
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)
。
答案 2 :(得分:9)
def zigzag(seq):
return seq[::2], seq[1::2]
答案 3 :(得分:0)
我只是想清除一些东西。假设您有一个列表
list1 = list(range(200))
您可以执行以下任一操作:
## OPTION A ##
a = list1[1::2]
b = list1[0::2]
或
## OPTION B ##
a = list1[0:][::2] # even
b = list1[1:][::2] # odd
在变量 a 和 b 中获得替代元素。
但是选项A 的速度是其两倍