2010-11-27 16 views
5

Gibt es eine Möglichkeit, mehrere Elemente zu einer Liste in einem Listenverständnis pro Iteration hinzuzufügen? Zum Beispiel:Liste Verständnis Frage

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

return [x, a for a in y] 

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

Antwort

6

sicher ist, aber nicht mit einer einfachen Liste Verständnis:

EDIT: Inspiriert durch eine andere Antwort:

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

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

So funktioniert es : sum fügt eine Sequenz von anythings hinzu, solange es ein __add__ Mitglied gibt, um die Arbeit zu erledigen. ABER, es beginnt mit einer anfänglichen Summe von 0. Sie können 0 nicht zu einer Liste hinzufügen, aber Sie können sum() einen anderen Startwert geben. Hier verwenden wir eine leere Liste.

Wenn Sie anstelle einer tatsächlichen Liste nur einen Generator benötigen, können Sie itertools.chain.from_iterable verwenden, der nur eine Reihe von Iteratoren in einen langen Iterator stringt.

from itertools import * 

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

oder ein noch itertools freundlich:

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

Es gibt andere Möglichkeiten, natürlich auch: Zunächst einmal können wir Adam Rosenfield der Verbesserung answer durch einen unnötigen Lambda-Ausdruck zu beseitigen:

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

seit Liste hat bereits ein Mitglied, das genau das tut, was wir brauchen. lässt

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

Schließlich gehen für eine reine Liste Verständnis, die als unelegant wie möglich ist: Wir könnten das gleiche mit map und Nebenwirkungen in list.extend erreichen

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

Hmm, ich mochte deine frühere Version, es sah sauberer aus. Das sieht weniger gut aus – Falmarri

+0

. . . 'chain.from_iterable' ist verfügbar in Python 2.6+ – mshsayem

1

Hier ist eine Möglichkeit:

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] 

(Der korrekte Wert ist in z)

+1

Warum die Downvotes? Diese Antwort funktioniert wie gewünscht. – SingleNegationElimination