Python程序将列表拆分为两个具有交替元素的列表

Rei*_*ica 15 python algorithm list

你能让它变得更简单/优雅吗?

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
Run Code Online (Sandbox Code Playgroud)

样本输出:

>>> zigzag('123456')
(['1', '3', '5'], ['2', '4', '6'])
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 45

如果seq你说的话,如果是一个清单,那么:

def zigzag(seq):
  return seq[::2], seq[1::2]
Run Code Online (Sandbox Code Playgroud)

如果seq是完全通用的可迭代的,例如可能是生成器:

def zigzag(seq):
  results = [], []
  for i, e in enumerate(seq):
    results[i%2].append(e)
  return results
Run Code Online (Sandbox Code Playgroud)

  • 所以太懒了。 (2认同)
  • @Sridhar,不要把它当作懒惰,把它想象成*时间效率*.我花了半个小时来处理算法,用*for*循环(对于*x*列,而不仅仅是两个).虽然我得到它的工作,它似乎没有*pythonic* - 我怀疑有一个更简单的方法.果然,我不记得列表中有*step*变量(如本答案中所示),这使得它变得微不足道. (2认同)

Raf*_*ird 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
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢列表,那么您可以return list(even),list(odd).


cob*_*bal 9

def zigzag(seq):
    return seq[::2], seq[1::2]
Run Code Online (Sandbox Code Playgroud)

  • 是的,但标题确实指定了一个列表 (3认同)