понимание списка для повторения элемента в списке по значению элемента

Я не могу понять код для этого, есть похожие сообщения: Повторяющиеся элементы в списке понимание

но я хочу повторить значение в списке по значению в списке

In [219]:

l = [3,1]

[i for x in range(i) for i in l]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-219-84d6f25dfd96> in <module>()
      1 l = [3,1]
      2 
----> 3 [i for x in range(i) for i in l]

TypeError: 'tuple' object cannot be interpreted as an integer

Я хочу такой список:

[3,3,3,1]

Также может кто-нибудь объяснить ошибку.

Примечание. Здесь я использую python 3.3.


person EdChum    schedule 06.08.2014    source источник
comment
Обратите внимание, что первый цикл for запускается первым, поэтому i там не определено.   -  person Ashwini Chaudhary    schedule 06.08.2014
comment
Что касается ошибки, вы должны были инициализировать i кортежем перед запуском понимания списка, поэтому вы получите эту ошибку в Pytton 3. range((1, 2)) --> TypeError: 'tuple' object cannot be interpreted as an integer   -  person Ashwini Chaudhary    schedule 06.08.2014


Ответы (2)


[x for x in l for _ in range(x)]
# Out[5]: [3, 3, 3, 1]

Но я предпочитаю более подробные, но более простые (буквальные) функции из itertools:

from itertools import chain, repeat
list(chain.from_iterable(repeat(x, x) for x in l))
person m.wasowski    schedule 06.08.2014
comment
Мне очень нравится ваш второй ответ, он более читабелен для меня, я на самом деле использую его, чтобы уменьшить многословие в ответе, который я опубликовал: stackoverflow.com/questions/25152470/, по какой-то причине понимание списка не работает для метода spell_len в моем ответе, но ваш itertools сделал - person EdChum; 06.08.2014

Еще одно решение.

l = [3,1]

ll = reduce(lambda a, b: a + [b] * b, l, [])

print ll
person user189    schedule 06.08.2014
comment
Откуда сокращение? - person EdChum; 06.08.2014
comment
Пожалуйста, взгляните на этот docs.python.org/2/library/functions. html#уменьшить - person user189; 06.08.2014
comment
Это отсутствует в python 3? Я использую питон 3.3 - person EdChum; 06.08.2014
comment
@EdChum По-видимому, в Python3 вам нужно импортировать его из functools (и, конечно же, использовать печать как функцию). - person user189; 06.08.2014
comment
Это очень неэффективное решение - с каждой итерацией вы создаете b новых списков, а затем объединяете их (медленно!) в a и друг с другом. Если вы профилируете его, вы обнаружите, что ваше решение имеет сложность около O(n^2)... - person m.wasowski; 06.08.2014