2015-12-13 2 views

ответ

4

Вы можете суммировать элементы и создать новый список с результатом:

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

Это эффективнее по сравнению с решениями с использованием итерации, потому что только один выделение памяти требуется. Выращивание списка на итерации включает в себя несколько распределений памяти, если ваш список имеет разумный размер.

+1

Это самое быстрое решение, особенно заметно, чем больше ваш список. – Reti43

+0

@zzoop Решает ли ваша проблема ваша проблема? –

0

Другой способ использования itertools.repeat, должен быть более эффективным (если сумма очень велика, список для 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 он позволяет полностью ленивую оценку, которая может быть полезна.

Смежные вопросы