Перечислить 4 списка питона одинаковой длины

Я хочу чередовать 4 списка одинаковой длины в python.

Я просматриваю этот сайт и вижу только, как чередовать 2 в python: чередование двух списков в Python

Может дать совет для 4 списков?

У меня есть списки, подобные этому

l1 = ["a","b","c","d"]
l2 = [1,2,3,4]
l3 = ["w","x","y","z"]
l4 = [5,6,7,8]

Мне нужен список, как

l5 = ["a",1,"w",5,"b",2,"x",6,"c",3,"y",7,"d",4,"z",8]

Ответ 1

Если списки имеют одинаковую длину, zip() может использоваться для чередования четырех списков, как это было использовано для чередования двух в связанном вами вопросе:

>>> l1 = ["a", "b", "c", "d"]
>>> l2 = [1, 2, 3, 4]
>>> l3 = ["w", "x", "y", "z"]
>>> l4 = [5, 6, 7, 8]
>>> l5 = [x for y in zip(l1, l2, l3, l4) for x in y]
>>> l5
['a', 1, 'w', 5, 'b', 2, 'x', 6, 'c', 3, 'y', 7, 'd', 4, 'z', 8]

Ответ 2

itertools.chain и zip:

from itertools import chain
l1 = ["a", "b", "c", "d"] l2 = [1, 2, 3, 4] l3 = ["w", "x", "y", "z"] l4 = [5, 6, 7, 8]
print(list(chain(*zip(l1, l2, l3, l4))))

Или как @PatrickHaugh предложил использовать chain.from_iterable:

list(chain.from_iterable(zip(l1, l2, l3, l4)))

Ответ 3

Из рецептов itertools

Рецепты itertool предлагают решение, называемое roundrobin которое допускает списки разной длины.

from itertools import cycle, islice

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    num_active = len(iterables)
    nexts = cycle(iter(it).__next__ for it in iterables)
    while num_active:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            # Remove the iterator we just exhausted from the cycle.
            num_active -= 1
            nexts = cycle(islice(nexts, num_active))

print(*roundrobin(*lists)) # a 1 w 5 b 2 x 6 c 3 y 7 d 4 z 8

С нарезкой

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

l1 = ["a","b","c","d"]
l2 = [1,2,3,4]
l3 = ["w","x","y","z"]
l4 = [5,6,7,8]

lists = [l1, l2, l3, l4]

lst = [None for _ in range(sum(len(l) for l in lists))]

for i, l in enumerate(lists):
    lst[i:len(lists)*len(l):len(lists)] = l

print(lst) # ['a', 1, 'w', 5, 'b', 2, 'x', 6, 'c', 3, 'y', 7, 'd', 4, 'z', 8]

Ответ 4

Для дополнительного разнообразия (или если вам нужно сделать это с помощью Pandas)

import pandas as pd
l1 = ["a","b","c","d"]
l2 = [1,2,3,4]
l3 = ["w","x","y","z"]
l4 = [5,6,7,8]

df = pd.DataFrame([l1 ,l2, l3, l4])
result = list(df.values.flatten('A'))

['a', 1, 'w', 5, 'b', 2, 'x', 6, 'c', 3, 'y', 7, 'd', 4, 'z', 8]

Ответ 5

Просто ради разнообразия numpy.dstack а затем flatten может сделать тот же трюк.

>>> import numpy as np
>>> l1 = ["a","b","c","d"]
>>> l2 = [1,2,3,4]
>>> l3 = ["w","x","y","z"]
>>> l4 = [5,6,7,8]
>>> np.dstack((np.array(l1),np.array(l2),np.array(l3),np.array(l4))).flatten()                                                                                                       
array(['a', '1', 'w', '5', 'b', '2', 'x', '6', 'c', '3', 'y', '7', 'd',                                                                                                              
       '4', 'z', '8'],                                                                                                                                                               
      dtype='|S21') 

Кстати, на самом деле вам не нужно создавать массив, короткая версия также работает

>>> np.dstack((l1,l2,l3,l4)).flatten()                                                                                                       
array(['a', '1', 'w', '5', 'b', '2', 'x', '6', 'c', '3', 'y', '7', 'd',                                                                                                              
       '4', 'z', '8'],                                                                                                                                                               
      dtype='|S21')   

Ответ 6

Другим способом может быть использование zip с np.concatenate:

import numpy as np
l5 = np.concatenate(list(zip(l1, l2, l3, l4)))
print(l5)

Результат:

['a' '1' 'w' '5' 'b' '2' 'x' '6' 'c' '3' 'y' '7' 'd' '4' 'z' '8']

Примечание: l5 является тип numpy.ndarray, вы можете преобразовать его в list либо list(l5) или l5.tolist()

Ответ 7

Использование zip и reduce:

import functools, operator
>>> functools.reduce(operator.add, zip(l1,l2,l3,l4))
('a', 1, 'w', 5, 'b', 2, 'x', 6, 'c', 3, 'y', 7, 'd', 4, 'z', 8)