Как методично объединить два списка? - PullRequest
0 голосов
/ 04 августа 2020

Итак, в основном у меня есть два списка в python, я хочу объединить их вместе, но определенным образом. Думаю, я хочу, чтобы они были переплетены. Вот пример.

List_a = [1, 2, 3]

List_b = [4, 5, 6]

Joined_Lists = [1, 4, 2, 5, 3, 6]

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

Ответы [ 4 ]

2 голосов
/ 04 августа 2020

Вот способ сделать это с назначением срезов, предполагая, что списки либо равной длины, либо a на 1 элемент длиннее, чем b:

def alternating(a, b):
    n = len(a) + len(b)
    out = [None] * n
    out[::2] = a
    out[1::2] = b
    return out

Примеры:

>>> alternating([1, 2, 3], [4, 5, 6])
[1, 4, 2, 5, 3, 6]
>>> alternating([1, 2, 3, 4], [5, 6, 7])
[1, 5, 2, 6, 3, 7, 4]
2 голосов
/ 04 августа 2020

Это можно сделать с пониманием:

def interleave(*iterables):
    return [x for y in zip(*iterables) for x in y]

Then

>>> interleave([1,2,3], [4,5,6])
[1, 4, 2, 5, 3, 6]
>>> interleave([1,2,3], [4,5,6], [7,8,9,10])
[1, 4, 7, 2, 5, 8, 3, 6, 9]

Обратите внимание, что это чередуется до тех пор, пока не будет исчерпана first итерация.

1 голос
/ 04 августа 2020

Удобный способ сделать это, очевидно, [x for sublist in zip(List_a, List_b) for x in sublist], первоначально упомянутый DarrylG (хотя, возможно, с другим именем переменной, поскольку zip выдает кортежи, а не списки). Но больше из любопытства, чем чего-либо еще, вот альтернатива:

import itertools

def intertwine(*lists):
    return list(next(i) for i in itertools.cycle(iter(x) for x in lists))

Необычным в этом примере является то, что for i in itertools.cycle(...) - это бесконечное l oop, но next(i) может повышать StopIteration, когда один из получаемых им итераторов исчерпан, и затем общий итератор (аргумент list) будет обрабатывать его так же, как если бы for i in ... l oop сделал то же самое.

Таким образом, это дает:

>>> intertwine([1,2,3], [4,5,6])
[1, 4, 2, 5, 3, 6]

Обратите внимание, что внешне эквивалентное понимание списка:

[next(i) for i in itertools.cycle(iter(x) for x in lists)]

будет не будет работать - явное StopIteration будет быть поднятым в коде пользователя.

0 голосов
/ 04 августа 2020

просто чтобы добавить к существующим (лучшим) решениям, отметив, что это, по сути, операция транспонирования

> np.array(List_a+List_b).reshape(2,3).transpose().reshape(1,6)

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