извлечение всех элементов из списка списков однострочником (без использования модулей)
У меня есть список списков:
arr = [[1, 2], [3, 4], [1, 4]]
Необходимо получить все элементы (числа) из данной конструкции
реализовал в лоб:
res = []
for obj in arr:
res += [elem for elem in obj]
но хочется однострочного решения
подскажите его можно стандартными средствами (без дополнительных библиотек) реализовать?
перебрал несколько вариантов, пока ничего не нашел :(
P.S.
нашел такой изврат (но это все таки богомерзкий изврат, а не красивое решение):
res = list(map(int, ' '.join(f"{obj[0]} {obj[1]}" for obj in arr).split()))
Ответы (1 шт):
Воспользуйтесь параметром sum(..., start=[]):
res = sum(arr, [])
результат:
In [4]: res
Out[4]: [1, 2, 3, 4, 1, 4]
Но наиболее идиоматичным решением в данном случае будет использование itertools.chain. Об этом даже есть упоминание в docstring по встроенной функции sum():
To concatenate a series of iterables, consider using itertools.chain().
from itertools import chain
res = list(chain.from_iterable(arr))
UPDATE: сравнение скорости выполнения разных решений:
In [9]: %timeit sum([list(range(1000))]*1000, [])
2.25 s ± 69.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [10]: %timeit [x for xs in [list(range(1000))]*1000 for x in xs]
27.9 ms ± 428 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [11]: %timeit list(chain.from_iterable([list(range(1000))]*1000))
11.8 ms ± 266 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)