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)]
Hmm, ich mochte deine frühere Version, es sah sauberer aus. Das sieht weniger gut aus – Falmarri
. . . 'chain.from_iterable' ist verfügbar in Python 2.6+ – mshsayem