Lista de comprensión para repetir elemento en una lista por valor de elemento

No puedo descifrar el código para hacer esto, hay publicaciones similares: Repetición de elementos en la lista de comprensión

pero quiero repetir un valor en la lista por el valor en la lista

In [219]: l = [3,1] [i for x in range(i) for i in l] --------------------------------------------------------------------------- TypeError Traceback (most recent call last)  in () 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 

Lo que quiero es una lista como esta:

 [3,3,3,1] 

También puede alguien explicar el error.

Tenga en cuenta que estoy ejecutando Python 3.3 aquí

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

Pero prefiero funciones más verbosas, pero más directas (literales) de itertools:

 from itertools import chain, repeat list(chain.from_iterable(repeat(x, x) for x in l)) 

Otra solución más.

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