de que hay, pero no con una lista simple de comprensión:
EDIT: Inspirado por otra respuesta:
y = ['a', 'b', 'c', 'd']
x = [1,2,3]
return sum([[x, a] for a in y],[])
Cómo funciona : sum agregará una secuencia de cualquier cosa, siempre y cuando haya un miembro __add__
para hacer el trabajo. PERO, comienza con un total inicial de 0. No puede agregar 0 a una lista, pero puede dar sum()
otro valor de inicio. Aquí usamos una lista vacía.
Si, en lugar de necesitar una lista real, solo quería un generador, puede usar itertools.chain.from_iterable
, que simplemente enlaza un conjunto de iteradores en un iterador largo.
from itertools import *
return chain.from_iterable((x,a) for a in y)
o una aún más itertools ambiente:
return itertools.chain.from_iterable(itertools.izip(itertools.repeat(x),y))
Hay otras maneras, también, por supuesto: Para empezar, podemos mejorar Adam Rosenfield de answer mediante la eliminación de una expresión lambda que no sean necesarios:
return reduce(list.__add__,([x, a] for a in y))
porque la lista ya tiene un miembro que hace exactamente lo que necesitamos. Podríamos conseguir lo mismo usando map
y los efectos secundarios en list.extend
:
l = []
map(l.extend,[[x, a] for a in y])
return l
Por último, vamos a dar una lista de comprensión pura que es tan poco elegante como sea posible:
return [ y[i/2] if i%2 else x for i in range(len(y)*2)]
Hmm, me gustó tu versión anterior, parecía más limpia. Esto parece menos legible – Falmarri
. . . 'chain.from_iterable' está disponible en Python 2.6+ – mshsayem