Программа Python для разделения списка на два списка с чередующимися элементами - PullRequest
14 голосов
/ 18 сентября 2009

Можете ли вы сделать его более простым / элегантным?

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'])

Ответы [ 3 ]

43 голосов
/ 18 сентября 2009

Если 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
10 голосов
/ 18 сентября 2009

Это берет итератор и возвращает два итератора:

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).

9 голосов
/ 18 сентября 2009
def zigzag(seq):
    return seq[::2], seq[1::2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...