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 шт):
Можно же два цикла в списковом сокращении написать (да и вообще сколько угодно циклов при желании). И учесть при этом, что функции в питоне (включая и лямбды) - это обычные переменные, из них можно список или кортеж составить и перебрать его в цикле:
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))
Еще вариант использовать 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, [])