Преобразовать список списков в один список
Как преобразовать список списков в один список?
Ответы (7 шт):
Автор решения: hedgehogues
→ Ссылка
def flatten(l):
return [item for sublist in l for item in sublist]
Автор решения: вася
→ Ссылка
l = [[1, 2, 3], [4, 5, 6]]
print(sum(l, [])) # [1, 2, 3, 4, 5, 6]
from itertools import chain
print(list(chain.from_iterable(l))) # [1, 2, 3, 4, 5, 6]
l2 = [['12', '34'], ['56', '78']]
print(list(map(''.join, l2))) # ['1234', '5678']
Варианты со сторонними библиотеками:
from numpy import array
from pandas.core.common import flatten
l = [[1, 2, 3], [4, 5, 6]]
print(list(array(l).flat))
print(list(flatten(l)))
Автор решения: Victor VosMottor thanks Monica
→ Ссылка
from functools import reduce #python 3
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(lambda x,y: x+y,l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> import operator
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(operator.concat, l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sum(l, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
import itertools
list2d = [[1,2,3], [4,5,6], [7], [8,9]]
merged = list(itertools.chain(*list2d))
import itertools
list2d = [[1,2,3], [4,5,6], [7], [8,9]]
merged = list(itertools.chain.from_iterable(list2d))
Автор решения: Oleg
→ Ссылка
vector = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18]]
a=[]
[[a.append(j) for j in i] for i in vector]
Автор решения: kulpinss
→ Ссылка
numbers=[[123], [456], [123, 4, 5, 6]]
flattened = []
for row in numbers:
for element in row:
flattened.append(element)
print(flattened) # [123, 456, 123, 4, 5, 6]
Автор решения: Vladimir Bogdanov
→ Ссылка
Попытка реализовать универсальную функцию, которая распаковывает все что угодно. Реализована в виде генератора, так что конечный результат можно собрать хоть в список, хоть во что-то другое. Одна из целей, минимизировать затраты на память. Если память не жалеть, то можно реализовать красивее и компактней (прожорливую версию не выкладываю). По возможности в очереди хранятся не сами распаковываемые значения, а итераторы.
from collections import deque
from collections.abc import Iterable
data = [
2,
[123],
[[456], 789],
[123, 4, (10, 11), 5, 6],
"somestring",
('str1','str2','str3'),
{"dict1": 21, "dict2": 22, "dict3": 23},
range(3),
{"set1", "set2", "set3"},
(i for i in range(100,103))
]
def unpack(*args: object):
iters_buff: deque[object] = deque()
# Т.к. args - это кортеж, делаем из него итератор и помещаем в очередь
iters_buff.append(iter(args))
while iters_buff:
match obj := iters_buff.popleft():
case Iterable() if not isinstance(obj, str):
i = 0
# Разбираем итерируемый объект
for _obj in obj:
if isinstance(_obj, Iterable) and not isinstance(_obj, str):
# Внутри может оказаться еще один итерируемый объект
iters_buff.insert(i, iter(_obj))
i += 1
elif i == 0:
# Если не итерируемый объект первый в списке, отдаем без сохранения
yield(_obj)
else:
# Иначе сохраняем на своем порядковом месте
# Когда до него дойдет очередь, отдадим в блоке case _:
iters_buff.insert(i, _obj)
i += 1
case _:
# Отдаем не итерируемый объект
yield obj
print(list(unpack(0,1,data,[(222,333),444,(555,777)])))
Автор решения: u111
→ Ссылка
Рекурсивный вариант:
def f(lst):
if type(lst) not in (list, tuple, set):
return [lst]
res = []
for i in lst:
res += f(i)
return res
x = [[0], [[[(1, 2), 3, {4, 5}, [6]]]]]
print(t(x)) # [0, 1, 2, 3, 4, 5, 6]