Python Итерация через список списка, чтобы создать новый список в последовательности индексов

Как бы вы перебирали список списков, например:

[[1,2,3,4], [5,6], [7,8,9]]

и постройте новый список, захватив первый элемент каждого списка, затем второй и т.д. Таким образом, это будет выглядеть следующим образом:

[1, 5, 7, 2, 6, 8, 3, 9, 4]

Ответ 1

Вы можете использовать понимание списка вместе с itertools.izip_longest (или zip_longest в Python 3)

from itertools import izip_longest
a = [[1,2,3,4], [5,6], [7,8,9]]
[i for sublist in izip_longest(*a) for i in sublist if i is not None]
# [1, 5, 7, 2, 6, 8, 3, 9, 4]

Ответ 2

Пока вы знаете, что None не появится, вы можете воспользоваться тем, как map() работает без функции:

outlist = [y for sub in map(None, *inlist) for y in sub if not y is None]

Ответ 3

DRY: itertools имеет рецепт, который звучит правильно для этой задачи: roundrobin

from itertools import cycle, islice

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))

l = [[1,2,3,4], [5,6], [7,8,9]]

print (list(roundrobin(*l)))
#[1, 5, 7, 2, 6, 8, 3, 9, 4]

Ответ 4

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

Держите N разных счетчиков, где n - количество списков в вашем списке и увеличивайте их каждый раз, когда вы добавляете новый элемент из этих подсписок. При их добавлении вы должны контролировать, что соответствующий счетчик наборов должен быть минимальным для всех других счетчиков, если все списки имеют оставшиеся элементы. Когда вы добавляете последний элемент списка, вы можете увеличить его счетчик до 9999, чтобы защитить наше минимальное правило.

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

Ответ 5

Решения, отфильтровывающие None, не будут работать, если None является значением из подсписок, которые вы хотели бы сохранить. Чтобы исправить это, вы можете сделать представление списка, которое выполняет итерации по индексам самого длинного подсписок и добавляет только подсписные элементы, если индекс находится в диапазоне.

a = [[1,2,3,4],[5,6,None],[7,8,9]]
range_longest = range(max(map(len, a)))
[sublist[i] for i in range_longest for sublist in a if i < len(sublist)]
# [1, 5, 7, 2, 6, 8, 3, None, 9, 4]