如何将可迭代对象分成包含交替元素的两个列表

18 投票
4 回答
12405 浏览
提问于 2025-04-15 14:24

我想把一个可迭代的对象分成两个列表,里面的元素交替排列。这里有一个可行的解决方案。但是有没有更简单的方法来实现这个呢?

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 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

11

这个代码会接收一个迭代器,然后返回两个迭代器:

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) 这样来返回。

51

如果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

撰写回答