不,不是,实际上是Shlemiel 画家算法 http://en.wikichip.org/wiki/schlemiel_the_painter%27s_algorithm。因为每次它想要连接一个新列表时,它都必须从头开始遍历整个列表。 (有关更多信息,请阅读 Joel 的这篇文章:http://www.joelonsoftware.com/articles/fog0000000319.html http://www.joelonsoftware.com/articles/fog0000000319.html)
最Pythonic的方法是使用列表理解:
In [28]: [t for n in range(1,5) for t in [n]*n ]
Out[28]: [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
Or itertools.chain
:
In [29]: from itertools import chain
In [32]: list(chain.from_iterable([n]*n for n in range(1,5)))
Out[32]: [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
或者作为纯粹的基于生成器的方法,您可以使用repeat
而不是将列表相乘:
In [33]: from itertools import chain, repeat
# In python2.X use xrange instead of range
In [35]: list(chain.from_iterable(repeat(n, n) for n in range(1,5)))
Out[35]: [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
或者,如果您对 numpy 感兴趣,或者您想要一种超快速的方法,这里就是:
In [46]: import numpy as np
In [46]: np.repeat(np.arange(1, 5), np.arange(1, 5))
Out[46]: array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])