Перечислить 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)