Вернуться список, где элементы взяты из списков в turn / python - PullRequest
1 голос
/ 25 сентября 2019

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

def combine_lists(a, b):
    """
    combine_lists([1, 2, 3], [4]) => [1, 4, 2, 3]
    combine_lists([1], [4, 5, 6]) => [1, 4, 5, 6]
    combine_lists([], [4, 5, 6]) => [4, 5, 6]
    combine_lists([1, 2], [4, 5, 6]) => [1, 4, 2, 5, 6]
    :param a: First list
    :param b: Second list
    :return: Combined list
    """

Что я пробовал:

# return a[0], b[0], a[1], b[1]
    combined_list = []
    for x, y in range (len(a), len(b)):
        combined_list = a[x], b[y]
    return combined_list

Ответы [ 3 ]

6 голосов
/ 25 сентября 2019

выглядит так, как вы хотите itertools.zip_longest:

from itertools import zip_longest

def combine_lists(*l):
    return [j for i in zip_longest(*l) for j in i if j]

combine_lists([1, 2], [4, 5, 6])
# [1, 4, 2, 5, 6]

combine_lists([1, 2, 3], [4])
# [1, 4, 2, 3]

combine_lists([], [4, 5, 6])
# [4, 5, 6]
1 голос
/ 25 сентября 2019

Я думаю, что это будет работать:

[x for x in itertools.chain.from_iterable(itertools.zip_longest(a, b)) if x is not None]
1 голос
/ 25 сентября 2019

Мой ответ не так прост, как @yatus, но вы можете использовать следующее:

def combine_lists(a, b):
    combined_list = []
    for e_a, e_b in zip(a, b):
        combined_list.append(e_a)
        combined_list.append(e_b)

    len_a = len(a)
    len_b = len(b)

    if len_a == len_b:
        return combined_list
    if len(a) > len_b:
        return combined_list + a[len_b:]
    # this means len_b is greater than len_a
    return combined_list + b[len_a:]

>>> combine_lists([1, 2, 3], [4])
[1, 4, 2, 3]
>>> combine_lists([1], [4, 5, 6])
[1, 4, 5, 6]
>>> combine_lists([], [4, 5, 6])
[4, 5, 6]
>>> combine_lists([1, 2], [4, 5, 6])
[1, 4, 2, 5, 6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...