Если у меня есть список a = [1, 2, 3]
, то сумма этого списка равна 6. Я хочу преобразовать a, чтобы перебрать его так, чтобы a = [1,1,1,1,1,1]
.Лучший способ создать новый список из списка в python
Лучший способ сделать это?
Если у меня есть список a = [1, 2, 3]
, то сумма этого списка равна 6. Я хочу преобразовать a, чтобы перебрать его так, чтобы a = [1,1,1,1,1,1]
.Лучший способ создать новый список из списка в python
Лучший способ сделать это?
Вы можете суммировать элементы и создать новый список с результатом:
>>> a = [1, 2, 3]
>>> a = [1] * sum(a)
>>> a
[1, 1, 1, 1, 1, 1]
Это эффективнее по сравнению с решениями с использованием итерации, потому что только один выделение памяти требуется. Выращивание списка на итерации включает в себя несколько распределений памяти, если ваш список имеет разумный размер.
Другой способ использования 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)
[]
Другое решение, использующее 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
он позволяет полностью ленивую оценку, которая может быть полезна.
Это самое быстрое решение, особенно заметно, чем больше ваш список. – Reti43
@zzoop Решает ли ваша проблема ваша проблема? –