2010-11-27 6 views
5

Existe-t-il un moyen d'ajouter plusieurs éléments à une liste dans une liste de compréhension par itération? Par exemple:question de compréhension de liste

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

return [x, a for a in y] 

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

Répondre

6

sûr qu'il y est, mais pas avec une compréhension simple liste:

EDIT: Inspiré par une autre réponse:

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

return sum([[x, a] for a in y],[]) 

Comment ça marche : sum ajoutera une séquence de anythings, tant qu'il y a un membre __add__ pour faire le travail. MAIS, il commence avec un total initial de 0. Vous ne pouvez pas ajouter 0 à une liste, mais vous pouvez donner sum() une autre valeur de départ. Ici, nous utilisons une liste vide. Si, au lieu d'avoir besoin d'une liste réelle, vous vouliez juste un générateur, vous pouvez utiliser itertools.chain.from_iterable, qui ne fait que chaîner un groupe d'itérateurs dans un long itérateur.

from itertools import * 

return chain.from_iterable((x,a) for a in y) 

ou un encore plus itertools amicales:

return itertools.chain.from_iterable(itertools.izip(itertools.repeat(x),y)) 

Il y a d'autres façons aussi, bien sûr: Pour commencer, nous pouvons améliorer Adam Rosenfield answer en éliminant une expression lambda non nécessaire:

return reduce(list.__add__,([x, a] for a in y)) 

puisque la liste a déjà un membre qui fait exactement ce dont nous avons besoin. Nous pourrions obtenir la même chose en utilisant map et les effets secondaires dans list.extend:

l = [] 
map(l.extend,[[x, a] for a in y]) 
return l 

Enfin, laisse aller pour une compréhension de la liste pure qui est aussi inélégant que possible:

return [ y[i/2] if i%2 else x for i in range(len(y)*2)] 
+0

Hmm, j'ai aimé votre version précédente, elle avait l'air plus propre. Cela semble moins lisible – Falmarri

+0

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

1

est ici une façon:

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] 

(La valeur correcte sera en z)

+1

pourquoi les downvotes? cette réponse fonctionne comme demandé. – SingleNegationElimination

Questions connexes