Взять элементы из нескольких списков - PullRequest
0 голосов
/ 05 октября 2018

Учитывая несколько списков, подобных показанным:

a = [1, 2, 3]
b = [5, 6, 7, 8]
c = [9, 0, 1]
d = [2, 3, 4, 5, 6, 7]
...

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

result = [1, 2, 3, 8, 6, 7]

Есть ли особенно хороший способ написать это.Я не могу думать о действительно простом без цикла for.Возможно понимание списка с умным почтовым индексом.Мне было бы интересно посмотреть, что вы, ребята, могли бы придумать.

Спасибо заранее:)

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

С itertools.zip_longest() для Python 3 работает с любым количеством входных списков:

>>> from itertools import zip_longest
>>> [next(x for x in t if x is not None) for t in zip_longest(a,b,c,d)]
[1, 2, 3, 8, 6, 7]

Значение по умолчанию - None, поэтому возьмите первый элемент none None в каждом кортеже, созданном с помощьюzip_longest вызов (вы можете изменить значения по умолчанию и критерии, если None является допустимым значением данных)

0 голосов
/ 05 октября 2018

С functools.reduce:

from functools import reduce
print(list(reduce(lambda a, b: a + b[len(a):], [a, b, c, d])))

Это выводит:

[1, 2, 3, 8, 6, 7]
0 голосов
/ 05 октября 2018

Простые нарезки и объединения:

a + b[len(a):]

Или с несколькими списками:

res = []
for lst in (a, b, c, d):
    res += lst[len(res):]
# [1, 2, 3, 8, 6, 7]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...