Преобразовать список списков в один список

Как преобразовать список списков в один список?


Ответы (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

source:

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]
→ Ссылка