Генерация нескольких значений в каждой итерации понимания списка - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы создать список, скажем, [0, 0^2, 1, 1^2, ... 9, 9^2] в Python. Однако [(i,i**2) for i in range(10)] возвращает список кортежей, а [*(i,i**2) for i in range(10)] не работает.

Есть ли какой-нибудь питонный способ создать такой список?

1 Ответ

2 голосов
/ 07 ноября 2019

Вы можете добавить другой уровень итерации в понимание списка, чтобы получить плоский список:

[i**exp for i in range(10) for exp in [1,2]]
# [0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

Или вы можете использовать itertools.chain:

from itertools import chain

list(chain.from_iterable((i,i**2) for i in range(10)))
# [0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

Хотя я бы рассмотрел numpy для такой задачи:

(np.arange(10)**np.arange(1,3)[:,None]).ravel('F')

array([ 0,  0,  1,  1,  2,  4,  3,  9,  4, 16,  5, 25,  6, 36,  7, 49,  8,
   64,  9, 81], dtype=int32)
...