2015-12-13 67 views

回答

4

可以總結的元素,並創建一個新的列表與結果:

>>> a = [1, 2, 3] 
>>> a = [1] * sum(a) 
>>> a 
[1, 1, 1, 1, 1, 1] 

相比,使用迭代,因爲只需要一個內存分配方案這是有效的。如果您的列表具有合理的大小,在迭代中增加列表涉及多個內存分配。

+1

這是迄今爲止最快的解決方案,尤其值得注意的是您的列表越大。 – Reti43

+0

@zzoop這是否解決您的問題? –

0

另一種方法是使用itertools.repeat,應該更有效率(如果a的總和非常非常大,那麼如果直接生成所有項目,b的列表將非常大,但是這樣我們使用迭代器,別擔心),請注意,您只能使用一次。

>>> from itertools import repeat 
>>> a = [1, 2, 3] 
>>> b = repeat(1, sum(a)) 
>>> type(b) 
<type 'itertools.repeat'> 
>>> list(b) 
[1, 1, 1, 1, 1, 1] 
>>> list(b) 
[] 
0

使用itertools的另一個解決方案只能遍歷原始列表一次。

>>> import itertools 
>>> a = [1, 2, 3] 
>>> [1 for i in itertools.chain.from_iterable(map(range, a))] 
[1, 1, 1, 1, 1, 1] 

發電機表達內的範圍構建體通常在名爲flatten函數找到。

創建列表可能是不必要的複雜,但在for循環中使用時,它可以完全延遲評估,這可能很有用。

相關問題