我可以用sum()加入列表吗?

VPf*_*PfB 3 python algorithm join list

sum()用于列表连接是pythonic 吗?

>>> sum(([n]*n for n in range(1,5)),[])
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

Kas*_*mvd 8

不,它不是,实际上它是画家算法shlemiel.因为每次它想要连接一个新列表时,它必须从头开始遍历整个列表.(欲了解更多信息,请阅读Joel撰写的这篇文章: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]
Run Code Online (Sandbox Code Playgroud)

或者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]
Run Code Online (Sandbox Code Playgroud)

或者作为基于纯生成器的方法,您可以使用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]
Run Code Online (Sandbox Code Playgroud)

或者如果你对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])
Run Code Online (Sandbox Code Playgroud)

  • 很好地解释了+1 (2认同)