Python чередует два списка неравной длины

У меня есть два списка, и я хочу объединить их поочередно, пока не закончится один, а затем я хочу продолжать добавлять элементы из более длинного списка.

Ака.

list1 = [a,b,c]

list2 = [v,w,x,y,z]

result = [a,v,b,w,c,x,y,z]

Аналогично этому вопросу ( Pythonic способ объединить два списка поочередно?), За исключением того, что списки перестают объединяться после того, как закончился первый список:(.

5 ответов

Решение

Вот более простая версия из отличного инструментария:

>>> interleave([[1,2,3,4,5,6,7,],[0,0,0]])
[1, 0, 2, 0, 3, 0, 4, 5, 6, 7]

Вы можете быть заинтересованы в этом itertools рецепт:

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

Например:

>>> from itertools import cycle, islice
>>> list1 = list("abc")
>>> list2 = list("uvwxyz")
>>> list(roundrobin(list1, list2))
['a', 'u', 'b', 'v', 'c', 'w', 'x', 'y', 'z']

Вы могли бы использовать простой map и список понимания:

>>> [x for t in map(None, a, b) for x in t if x]
['a', 'v', 'b', 'w', 'c', 'x', 'y', 'z']

Мое решение:

result = [i for sub in zip(list1, list2) for i in sub]

РЕДАКТИРОВАТЬ: Вопрос указывает, что более длинный список должен продолжаться в конце более короткого списка, что этот ответ не делает.

Мы можем использовать zip_longest с ответом user2968103

      import itertools
result = [i for sub in itertools.zip_longest(list1, list2) for i in sub]
Другие вопросы по тегам