python: запись в список по нескольку значений за раз

подскажите в питоне вообще можно ли реализовать такую вещь в 1 строку встроенными производительными средствами:

f = lambda x: x + 2
g = lambda x: x * 3

arr = [1, 2, 3]
res = []

for x in arr:
    res.append(f(x))
    res.append(g(x))

т.е. требуется создать новый массив где от каждого элемента старого массива будет получено 2 значения

очень бы хотелось чтобы существовало встроенное решение по типу:

tmp = [f(x), g(x) for x in arr]

но пока кажется что его нет максимум во что можно схлопнуть начальное решение без потери производительности - это в

res = []

for x in arr:
    res += [f(x), g(x)]

или все таки существует решение (без привлечения дополнительных библиотек)?


Ответы (2 шт):

Автор решения: CrazyElf

Можно же два цикла в списковом сокращении написать (да и вообще сколько угодно циклов при желании). И учесть при этом, что функции в питоне (включая и лямбды) - это обычные переменные, из них можно список или кортеж составить и перебрать его в цикле:

res = [z(x) for x in arr for z in (f,g)]

Такое списковое сокращение даст на выходе "плоский" список, как и требуется.

По сути это аналог такого кода:

res = []
for x in arr:
    for z in (f,g):
        res.append(z(x))
→ Ссылка
Автор решения: Roman-Stop RU aggression in UA

Еще вариант использовать functools.reduce:

reduce(lambda l, e: l + [f(e), g(e)], arr, [])

Этот вариант будет создавать новый список на каждой итерации, чтоб этого избежать, и делать только append-ы на оригинальном придется чуть усложнить:

reduce(lambda l, e: (l.append(f(e)), l.append(g(e)), l)[-1], arr, [])
→ Ссылка