2010-11-27 14 views
5

¿Hay alguna manera de agregar varios elementos a una lista en una lista de comprensión por iteración? Por ejemplo:lista pregunta de comprensión

y = ['a', 'b', 'c', 'd'] 
x = [1,2,3] 

return [x, a for a in y] 

de salida: [[1,2,3], 'a', [1,2,3], 'b', [1,2,3], 'c', [1,2,3], 'd']

Respuesta

6

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)] 
+0

Hmm, me gustó tu versión anterior, parecía más limpia. Esto parece menos legible – Falmarri

+0

. . . 'chain.from_iterable' está disponible en Python 2.6+ – mshsayem

1

Aquí hay una manera:

y = ['a', 'b', 'c', 'd'] 
x = [1,2,3] 

return reduce(lambda a,b:a+b, [[x,a] for a in y]) 
1
x = [1,2,3] 
y = ['a', 'b', 'c', 'd'] 
z = [] 

[z.extend([x, a]) for a in y] 

(El valor correcto estará en z)

+1

¿por qué los votos a favor? esta respuesta funciona según lo solicitado. – SingleNegationElimination

Cuestiones relacionadas