如果我有列表a = [1, 2, 3]
,则此列表的总和为6.我想转换a来迭代它以便a = [1,1,1,1,1,1]
。
最好的方法吗?
答案 0 :(得分:4)
您可以对元素求和并使用结果创建新列表:
>>> a = [1, 2, 3]
>>> a = [1] * sum(a)
>>> a
[1, 1, 1, 1, 1, 1]
与使用迭代的解决方案相比,这是有效的,因为只需要一个内存分配。如果您的列表具有合理的大小,则在迭代中增加列表涉及多个内存分配。
答案 1 :(得分: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)
[]
答案 2 :(得分: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]
生成器表达式中的range构造通常位于名为flatten
的函数中。
创建列表可能不必要地复杂,但是当在for
循环中使用时,它允许完全惰性的评估,这可能是有用的。