简体   繁体   English

如何将可迭代对象拆分为两个具有交替元素的列表

[英]How to split an iterable into two lists with alternating elements

I want to split an iterable into two lists with alternating elements.我想将一个可迭代对象拆分为两个具有交替元素的列表。 Here is a working solution.这是一个有效的解决方案。 But is there a simpler way to achieve the same?但是有没有更简单的方法来实现相同的目标?

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

Sample output:示例输出:

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

If seq is a sequence, then:如果seq是一个序列,则:

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

If seq is a totally generic iterable, such as possibly a generator:如果seq是一个完全通用的可迭代对象,例如可能是一个生成器:

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

This takes an iterator and returns two iterators:这需要一个迭代器并返回两个迭代器:

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

If you prefer lists then you can return list(even),list(odd) .如果您更喜欢列表,则可以return list(even),list(odd)

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

I just wanted to clear something.我只是想清除一些东西。 Say you have a list说你有一个清单

list1 = list(range(200))

you can do either :你可以这样做:

## OPTION A ##
a = list1[1::2]
b = list1[0::2]

or要么

## OPTION B ##
a = list1[0:][::2] # even
b = list1[1:][::2] # odd

And get have alternative elements in variable a and b .并在变量ab 中获得替代元素。

But OPTION A is twice as fast选项 A 的速度是原来的两倍

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM