从python中的列表创建新列表的最佳方法

从python中的列表创建新列表的最佳方法,python,list,Python,List,如果我有lista=[1,2,3]这个列表的总和是6。我想将a转换为遍历它,这样a=[1,1,1,1,1,1] 最好的方法是?您可以对元素求和并创建一个新列表,结果如下: >>> a = [1, 2, 3] >>> a = [1] * sum(a) >>> a [1, 1, 1, 1, 1, 1] 与使用迭代的解决方案相比,这是有效的,因为只需要一个内存分配。如果列表大小合理,则在迭代中增加列表需要多个内存分配。您可以对元素求和并创建一个

如果我有list
a=[1,2,3]
这个列表的总和是6。我想将a转换为遍历它,这样
a=[1,1,1,1,1,1]


最好的方法是?

您可以对元素求和并创建一个新列表,结果如下:

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

与使用迭代的解决方案相比,这是有效的,因为只需要一个内存分配。如果列表大小合理,则在迭代中增加列表需要多个内存分配。

您可以对元素求和并创建一个新列表,结果如下:

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

与使用迭代的解决方案相比,这是有效的,因为只需要一个内存分配。如果列表的大小合理,则在迭代中增加列表需要多个内存分配。

另一种方法是使用
itertools。重复
,应该更有效(如果a的总和非常非常大,如果直接生成所有项,则b的列表将非常大,但这样我们使用iterator,不用担心),请注意,您只能使用它一次

>>> 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)
[]
>>从itertools导入重复
>>>a=[1,2,3]
>>>b=重复(1,和(a))
>>>类型(b)
>>>名单(b)
[1, 1, 1, 1, 1, 1]
>>>名单(b)
[]

另一种方法是使用
itertools。重复
,应该更有效(如果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)
[]
>>从itertools导入重复
>>>a=[1,2,3]
>>>b=重复(1,和(a))
>>>类型(b)
>>>名单(b)
[1, 1, 1, 1, 1, 1]
>>>名单(b)
[]

另一个使用
itertools
的解决方案,它只遍历原始列表一次

>>> import itertools
>>> a = [1, 2, 3]
>>> [1 for i in itertools.chain.from_iterable(map(range, a))]
[1, 1, 1, 1, 1, 1]
生成器表达式中的范围构造通常位于名为
flatte
的函数中


创建列表可能不必要地复杂,但当在
for
循环中使用时,它允许完全延迟计算,这可能很有用。

另一种使用
itertools
的解决方案,只遍历原始列表一次

>>> import itertools
>>> a = [1, 2, 3]
>>> [1 for i in itertools.chain.from_iterable(map(range, a))]
[1, 1, 1, 1, 1, 1]
生成器表达式中的范围构造通常位于名为
flatte
的函数中


创建列表可能不必要地复杂,但当在
for
循环中使用时,它允许完全惰性评估,这可能很有用。

这是迄今为止最快的解决方案,列表越大,尤其值得注意。这是迄今为止最快的解决方案,列表越大,尤其值得注意。