在列表理解的每次迭代中生成多个值

时间:2019-11-07 15:21:13

标签: python list iterator list-comprehension

我想在python中生成一个列表,例如[0, 0^2, 1, 1^2, ... 9, 9^2]。但是,[(i,i**2) for i in range(10)]返回一个元组列表,而[*(i,i**2) for i in range(10)]不起作用。

是否有任何Python方式创建这样的列表?

1 个答案:

答案 0 :(得分:2)

您可以在列表理解中添加另一级别的迭代以获取平面列表:

[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)