Объединить элементы из двух списков - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу объединить два массива в python особым образом.Записи с нечетным индексом моего выходного массива out должны быть основными записями моего первого входного массива in0.Записи с четным индексом в out должны быть основными элементами моего второго входного массива in1.

in0, in1 и out одинаковой длины.

Пример:

Входные массивы

in0 = [0, 1, 2, 3]
in1 = [4, 5, 6, 7]

должны быть объединены с выходным массивом

out = [0, 5, 2, 7]

Есть ли лучший способ, чем перебрать вседлина входов и заполнить мои out «вручную»?

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Если вы не возражаете против многословия ...

from itertools import cycle

in0 = [0, 1, 2, 3]
in1 = [4, 5, 6, 7]

out = [pair[i] for pair, i in zip(zip(in0, in1), cycle([0,1]))]

Как это работает:

  1. zip(in0, in1) - это последовательность кортежей, (0,4), (1,5), (2,6), (3,7).

  2. cycle([0,1]) - это бесконечный поток чередующихся нулей и единиц, который будет использоваться в качестве индексов в кортежах с шага 1.

  3. zip(zip(...), cycle(...)) создает пару кортежей и индексов:

    (0, (0,4)), (1, (1,5)), (0, (2,6)), (1, (3,7)).
    
  4. Понимание списка берет правильный элемент из каждого кортежа.

В конце, понимание списка - это общая версия

[(0,4)[0], (1,5)[1], (2,6)[0], (3,7)[1]]
0 голосов
/ 22 февраля 2019

Без использования циклов, но не в том же порядке, который вы запрашивали:

>> in0 = [0, 1, 2, 3]
>> in1 = [4, 5, 6, 7]
>> out = in0[0::2] + in1[1::2]
>> out
[0, 2, 5, 7]

РЕДАКТИРОВАТЬ: исправление порядка вывода с помощью itertools:

>> import itertools
>> in0 = [0, 1, 2, 3]
>> in1 = [4, 5, 6, 7]
>> out = list(itertools.chain(*zip(in0[0::2], in1[1::2])))
>> out
[0, 5, 2, 7]
0 голосов
/ 22 февраля 2019

Если вы счастливы сделать полное копирование списка, это просто с нарезкой:

>>> in0 = [0, 1, 2, 3]
>>> in1 = [4, 5, 6, 7]
>>> out = in0[:]
>>> out[1::2] = in1[1::2]
>>> out
[0, 5, 2, 7]
0 голосов
/ 22 февраля 2019

Вы можете использовать понимание списка и выбрать значения из in0 для четных индексов и in1 для нечетных индексов:

[in0[i] if i % 2 == 0 else in1[i] for i in range(len(in0))]
# [0, 5, 2, 7]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...