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

时间:2009-09-18 05:53:09

标签: 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

示例输出:

>>> zigzag('123456')
(['1', '3', '5'], ['2', '4', '6'])

4 个答案:

答案 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 的速度是其两倍